Saya mencoba mencetak baris yang cocok dan baris ke-4 dari baris yang cocok (baris yang berisi ekspresi yang saya cari).
Saya telah menggunakan kode berikut:sed -n 's/^[ t]*//; /img class="devil_icon/,4p' input.txt
Tapi ini hanya mencetak baris yang cocok.
Ini hanya mencetak baris ke-4.awk 'c&&!--c;/img class="devil_icon/{c=4}' input.txt
Saya perlu mencetak baris yang cocok dan baris ke-4 saja.
Jawaban yang Diterima:
Dalam awk, Anda akan melakukannya sebagai berikut
awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`
atau
awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`
Penjelasan
Solusi pertama menemukan semua baris yang cocok dengan pattern
. Ketika menemukan kecocokan, ia menyimpan nomor catatan (NR
) dalam larik nr
. Itu juga menyimpan catatan ke-4 dari NR
dalam larik yang sama. Ini dilakukan oleh nr[NR+4]
. Setiap catatan (NR
) kemudian diperiksa untuk melihat apakah ada di nr
array, jika demikian catatan dicetak.
Solusi kedua pada dasarnya bekerja dengan cara yang sama, kecuali ketika menemukan pattern
itu mencetak baris itu, dan kemudian menyimpan catatan ke-4 di depannya dalam larik nr
, lalu pergi ke rekaman berikutnya. Kemudian ketika awk
menemukan catatan ke-4 ini NR in nr
blok akan dieksekusi dan mencetak catatan +4 ini setelahnya.
Contoh
Berikut ini contoh file data, sample.txt
.
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
Menggunakan solusi pertama:
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
Menggunakan solusi ke-2:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14