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