¿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.

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)).


10

este es un trabajo para awk

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

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


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.