Come stampare le righe numero 15 e 25 su ciascuna 50 righe?


9

Ho un file di grandi dimensioni e vorrei stampare da ogni 50 righe sequenziali, la 15a e la 25a riga.

sed -n '15,25p' inputfile

Come modificare questo comando per stampare solo le righe 15 e 25 e per scorrere ogni 50 righe nel file.

Risposte:


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

sarebbe l'ovvio modo portatile.

Nota sedun'alternativa GNU :

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

Con qualsiasi sed, puoi sempre fare:

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'

(ottieni la riga successiva 14 volte, stampa, riga successiva 10 volte, stampa, riga successiva 25 volte, torna al ciclo successivo (che afferra la riga aggiuntiva mancante per fare 50)).


10

questo è un lavoro per awk

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

modifica: sono stato fuorviato dalle istruzioni sed in OP.


9

Con perl

1) Simile alla awksoluzione, $.variabile memorizza il numero di riga

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

2) Verificare con l'elenco dei numeri di riga, più facile da estendere

$ 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

Un altro approccio che utilizza awk, basato sull'idea di Sundeep di utilizzare un elenco:

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

Impostare le chiavi nell'array in abase alle linee che si desidera stampare. Stampa le linee in NR % 50corrispondenza di una delle chiavi dell'array.


Per dare qualche indicazione sulla prestazione, ho cronometrato questo approccio e confrontato con le altre risposte, prendendo una media del usertempo per 3 corse.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.