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.
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:
awk 'NR % 50 == 15 || NR % 50 == 25'
sarebbe l'ovvio modo portatile.
Nota sed
un'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)).
Con perl
1) Simile alla awk
soluzione, $.
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
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 a
base alle linee che si desidera stampare. Stampa le linee in NR % 50
corrispondenza 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 user
tempo 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