2013-04-22 7 views
6

So come ottenere una serie di linee usando awk e sed. Inoltre so come stampare ogni ennesima riga usando awk e sed.Come posso ottenere un intervallo di linea ogni ennesimo intervallo usando awk, sed, o un altro comando unix?

Tuttavia, non so come combinare i due.

Ad esempio, ho un file con 1780000 linee.

Per ogni 17800a riga, desidero stampare la 17800a linea più le due successive.

Quindi, se ho un file con 1780000 linee e si riparte da 1 e termina a 1.780.000, questo stampa:

1 
2 
3 
17800 
17801 
17802 
35600 
35601 
35602 
# ... and so on. 

Qualcuno sa come ottenere una gamma di linea di ogni intervallo ennesima utilizzando awk, sed, o altro comando unix?

risposta

4

Utilizzando GNU sed:

sed -n '0~17800{N;N;p}' input 

Significato,

For every 17800th line: 0~17800 
    Read two lines: {N;N; 
    And print these out: p} 

Possiamo anche aggiungere le prime tre righe:

sed -n -e '1,3p' -e '0~17800{N;N;p}' input 

Utilizzando Awk, questo sarebbe più semplice:

awk 'NR%17800<3 || NR==3 {print}' input 
+0

Grazie mille. Quindi se voglio stampare 100 righe dopo l'ennesima riga, ho bisogno di 100 di N; o c'è un modo più semplice? –

+0

Sì, hai bisogno di 100 N, in tal caso awk è chiaramente la strada da percorrere. – perreal

+0

ma puoi anche usare uno script per generare lo script sed – perreal

2
$ cat file 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

$ awk '!(NR%3)' file 
3 
6 
9 

$ awk -v intvl=3 -v delta=2 '!(NR%intvl){print "-----"; c=delta} c&&c--' file 
----- 
3 
4 
----- 
6 
7 
----- 
9 
10 

$ awk -v intvl=4 -v delta=2 '!(NR%intvl){print "-----"; c=delta} c&&c--' file 
----- 
4 
5 
----- 
8 
9 

$ awk -v intvl=4 -v delta=3 '!(NR%intvl){print "-----"; c=delta} c&&c--' file 
----- 
4 
5 
6 
----- 
8 
9 
10 
Problemi correlati