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
egrep "pattern" -A4