¿Cómo imprimir las líneas número 15 y 25 de cada 50 líneas?

9

Tengo un archivo grande y me gustaría imprimir de cada 50 líneas secuenciales, las líneas 15 y 25 .

sed -n '15,25p' inputfile

Cómo modificar este comando para imprimir solo las líneas 15 y 25 y recorrer cada 50 líneas en el archivo.

Mohsen El-Tahawy
fuente

Respuestas:

22
awk 'NR % 50 == 15 || NR % 50 == 25'

sería la forma portátil obvia.

Tenga en cuenta una sedalternativa GNU :

sed '15~50b;25~50b;d'

Con cualquiera sed, siempre puedes hacer:

sed -n 'n;n;n;n;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n'

(obtenga la siguiente línea 14 veces, imprima, la siguiente línea 10 veces, imprima, la siguiente línea 25 veces, regrese al siguiente ciclo (que toma la línea extra que falta para hacer 50)).

Stéphane Chazelas
fuente
10

este es un trabajo para awk

awk '(NR%50==15) || (NR%50==25)' inputfile

editar: Fui engañado por instrucciones sed en OP.

Archemar
fuente
9

Con perl

1) Similar a la awksolución, la $.variable almacena el número de línea

$ seq 135 | perl -ne 'print if $.%50==15 || $.%50==25'
15
25
65
75
115
125

2) Verifique con la lista de números de línea, más fácil de extender

$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25)'
15
25
65
75
115
125

$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25,32)'
15
25
32
65
75
82
115
125
132
Sundeep
fuente
4

Otro enfoque usando awk, basado en la idea de Sundeep de usar una lista:

awk 'BEGIN { a[15] a[25] }; NR % 50 in a'

Establezca las claves en la matriz en afunción de las líneas que desea imprimir. Imprima líneas donde NR % 50coincida con una de las claves de la matriz.


Para dar alguna indicación del rendimiento, cronometré este enfoque y lo comparé con las otras respuestas, tomando un promedio del usertiempo para 3 carreras.

0.276s

$ time awk 'BEGIN { a[15] a[25] }; NR % 50 in a' <(seq 1000000) > /dev/null

0.374s

$ time awk 'NR % 50 == 15 || NR % 50 == 25' <(seq 1000000) > /dev/null

0.384s

$ time perl -ne 'print if $.%50==15 || $.%50==25' <(seq 1000000) > /dev/null

0.542s

$ time perl -ne 'print if grep {$_==$.%50} (15,25)' <(seq 1000000) > /dev/null
Tom Fenech
fuente