2011-06-27 22 views
15

Me gustaría obtener su consejo/ayuda sobre cómo subconjuntar un archivo grande (millones de filas o líneas).cómo subconjunto de un archivo - seleccione un número de filas o columnas

Por ejemplo,

(1) Tengo archivo grande (millones de filas, delimitado por tabuladores). Quiero un subconjunto de este archivo con solo filas de 10000 a 100000.

(2) Tengo un archivo grande (millones de columnas, delimitadas por tabuladores). Quiero un subconjunto de este archivo con sólo las columnas de 10000 a 100000.

Sé que hay herramientas como la cabeza, cola, cortar, dividir y awk o sed. Puedo usarlos para hacer subconjuntos simples. Pero, no sé cómo hacer este trabajo.

¿Podría dar algún consejo? Gracias por adelantado.

Respuesta

22

filas de filtrado es fácil, por ejemplo, con AWK:

cat largefile | awk 'NR >= 10000 && NR <= 100000 { print }' 

columnas de filtrado es más fácil con la CUT:

cat largefile | cut -d '\t' -f 10000-100000 

Como se mencionó Rahul Dravid, cat no es una necesidad aquí, y como Zsolt Botykai agregó que puede mejorar el rendimiento utilizando:

awk 'NR > 100000 { exit } NR >= 10000 && NR <= 100000' largefile 
cut -d '\t' -f 10000-100000 largefile 
+5

+1 esta es la respuesta más simple que jamás podría pensar of.But el gato no se requiere here.we puede hacer esto sin cat.'awk 'NR> = 10000 && NR <= 100000 {print}' largefile' y 'cut -d '\ t' -f 10000-100000 largefile' – Vijay

+0

@Rahul Dravid: gracias, lo agregaré – Drakosha

+6

Puede acortar el primero a:' awk 'NR> = 10000 && NR <= 100000 'archivo grande', ese es un proceso menos, y la acción predeterminada de awk es imprimir si el rango se evalúa como verdadero. Pero eso arrastra las líneas afters 100000 para nada, así que mejor escríbalo como: 'awk 'NR> 100000 {exit} NR> = 10000 && NR <= 100000' largefile' ya que de esta manera el procesamiento se detendrá en la 100001ª línea. –

15

Algunos differe soluciones nt:

Para fila rangos: En sed:

sed -n 10000,100000p somefile.txt 

Para la columna rangos 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 
+0

Muchas gracias, Rahul. Me das una buena dirección sobre sed y awk. Aunque puedo usarlos en una operación simple, aprendí mucho de ti. –

3

fue golpeado hasta que la solución sed, por lo que voy a publicar una perl dito en su lugar. Para imprimir las líneas 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 en conjunción con -a, para elegir el delimitador en el que para dividir líneas.

Para probar, usar seq y paste para conseguir 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 

Lets de imprimir 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 declaración join anteriormente, hay una pestaña , lo obtienes haciendo una pestaña ctrl-v.

4

Para el primer problema, la selección de un conjunto de filas de un archivo grande, la tubería de cola a la cabeza es muy simple. Quiere 90000 filas de archivo grande comenzando en la fila 10000.la cola agarra el extremo posterior del archivo grande comenzando en la fila 10000 y luego la cabeza corta todas las filas excepto las primeras 90000.

tail -n +10000 largefile | head -n 90000 - 
Cuestiones relacionadas