2013-04-22 23 views
6

Wiem, jak uzyskać zakres linii za pomocą awk i sed. Wiem również, jak wydrukować każdą n-tą linię za pomocą awk i sed.Jak mogę uzyskać zasięg linii w każdym n-tym interwale przy użyciu awk, sed lub innego polecenia unix?

Jednak nie wiem, jak połączyć te dwa.

Na przykład mam plik z 1780000 liniami.

Dla każdej 17800-tej linii chciałbym wydrukować 17800. linię plus dwie następne.

Więc jeśli mam plik 1780000 linii i zaczyna się od 1, a kończy się na 1780000, to wypisze:

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

Czy ktoś wie jak zdobyć szereg linii każdy n-ty interwał za pomocą awk, sed, lub inne polecenie unix?

Odpowiedz

4

Korzystanie GNU sed:

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

znaczenie,

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

Możemy również dodać pierwsze trzy wiersze:

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

Korzystanie AWK, byłoby to prostsze:

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

Dziękuję bardzo. Więc jeśli chcę wydrukować 100 linii po n-tej linii, potrzebuję 100 N; czy jest łatwiejszy sposób? –

+0

Tak, potrzebujesz 100 N-ów, w tym przypadku awk jest zdecydowanie najlepszy. – perreal

+0

ale można również użyć skryptu do generowania skryptu 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