一致した行と一致した行の4行目(検索している式を含む行)を印刷しようとしています。
私は次のコードを使用しています:
sed -n 's/^[ t]*//; /img class="devil_icon/,4p' input.txt
ただし、これは一致した行のみを印刷します。
これにより、4行目のみが出力されます。
awk 'c&&!--c;/img class="devil_icon/{c=4}' input.txt
一致した行と4行目の両方を印刷する必要があります。
承認された回答:
awkでは、次のようにします
awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`
または
awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`
説明
最初の解決策は、pattern
に一致するすべての行を検索します 。一致するものが見つかると、レコード番号(NR
)が保存されます。 )配列内nr
。 NR
からの4番目のレコードも保存します 同じ配列内。これはnr[NR+4]
によって行われます 。すべてのレコード(NR
)は、nr
に存在するかどうかを確認するためにチェックされます 配列の場合、レコードが印刷されます。
2番目のソリューションは、pattern
に遭遇した場合を除いて、基本的に同じように機能します。 その行を出力してから、その前の4番目のレコードを配列nr
に格納します。 、次に次のレコードに移動します。次に、awk
この4番目のレコードに遭遇しますNR in nr
ブロックが実行され、その後この+4レコードが出力されます。
例
データファイルの例を次に示します。sample.txt
。
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
最初のソリューションの使用:
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
2番目のソリューションの使用:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14