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.
fuente
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.
awk 'NR % 50 == 15 || NR % 50 == 25'
sería la forma portátil obvia.
Tenga en cuenta una sed
alternativa 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)).
este es un trabajo para awk
awk '(NR%50==15) || (NR%50==25)' inputfile
editar: Fui engañado por instrucciones sed en OP.
Con perl
1) Similar a la awk
solució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
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 a
función de las líneas que desea imprimir. Imprima líneas donde NR % 50
coincida 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 user
tiempo 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