linux - tag - picard app
cómo subcontratar un archivo-seleccione un número de filas o columnas (4)
Me gustaría recibir su consejo / ayuda sobre cómo subcontratar un archivo grande (millones de filas o líneas).
Por ejemplo,
(1) Tengo un archivo grande (millones de filas, delimitado por tabulaciones). Quiero un subconjunto de este archivo con solo filas de 10000 a 100000.
(2) Tengo un archivo grande (millones de columnas, delimitado por tabulaciones). Quiero un subconjunto de este archivo con solo columnas de 10000 a 100000.
Sé que hay herramientas como cabeza, cola, corte, división y awk o sed. Puedo usarlos para hacer subconjuntos simples. Pero, no sé cómo hacer este trabajo.
¿Podría por favor dar algún consejo? Gracias por adelantado.
Algunas soluciones diferentes:
Para rangos de filas: En sed
:
sed -n 10000,100000p somefile.txt
Para rangos de columnas en awk
:
awk -v f=10000 -v t=100000 ''{ for (i=f; i<=t;i++) printf("%s%s", $i,(i==t) ? "/n" : OFS) }'' details.txt
Filtrar filas es fácil, por ejemplo con AWK:
cat largefile | awk ''NR >= 10000 && NR <= 100000 { print }''
Filtrar columnas es más fácil con CUT:
cat largefile | cut -d ''/t'' -f 10000-100000
Como mencionó Rahul Dravid, el cat
no es una obligación aquí, y como agregó Zsolt Botykai, puede mejorar el rendimiento usando:
awk ''NR > 100000 { exit } NR >= 10000 && NR <= 100000'' largefile
cut -d ''/t'' -f 10000-100000 largefile
Le dieron una paliza por la solución sed, por lo que publicaré un perl
Dito en su lugar. Para imprimir lineas seleccionadas.
$ seq 100 | perl -ne ''print if $. >= 10 && $. <= 20''
10
11
12
13
14
15
16
17
18
19
20
Para imprimir columnas selectivas, utilice
perl -lane ''print $F[1] .. $F[3] ''
-F
se utiliza junto con -a
, para elegir el delimitador para dividir las líneas.
Para probar, usa seq
y paste
para obtener generar algunas columnas
$ seq 50 | paste - - - - -
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
26 27 28 29 30
31 32 33 34 35
36 37 38 39 40
41 42 43 44 45
46 47 48 49 50
Imprimimos todo excepto la primera y la última columna
$ seq 50 | paste - - - - - | perl -lane ''print join " ", $F[1] .. $F[3]''
2 3 4
7 8 9
12 13 14
17 18 19
22 23 24
27 28 29
32 33 34
37 38 39
42 43 44
47 48 49
En la instrucción de join
anterior, hay una pestaña, se obtiene haciendo una pestaña ctrl-v.
Para el primer problema, seleccionar un conjunto de filas de un archivo grande, es muy sencillo de unir a la cola. Desea 90000 filas del archivo grande a partir de la fila 10000. la cola agarra el extremo posterior del archivo grande a partir de la fila 10000 y luego la cabeza corta todas las filas excepto las primeras 90000.
tail -n +10000 largefile | head -n 90000 -