一致する行の前のn行、一致する行、一致する行内のn行を印刷したいと思います。ここで、nは2より大きい。
以下は私のデータファイルの例です(以下の行番号は識別のためのデータの一部ではありません)。ファイルから私が検索するパターンは「blah」ですexample.txt
。
$ cat example.txt
1. a
2. b
3. c
4. d
5. blah
6. e
7. f
8. g
9. h
10. blah
11. i
12. f
13. g
14. h
私は出力が次のようになります:
1. b
2. blah
3. g
4. f
5. blah
6. g
パッドおすすめをしてください!
ベストアンサー1
awk -vn=3 '/blah/{print l[NR%n];print;p[NR+n]};(NR in p);{l[NR%n]=$0}'
重複しないと仮定します。重複する部分がある場合は、関連するすべての行が印刷されますが、複数回印刷されることもあり、必ずしも入力した順序で印刷されるわけではありません。
これを防ぐには、次のように書くことができます。
awk -vn=3 '/blah/{p[NR-n]p[NR]p[NR+n]};(NR-n in p){print l[NR%n]}
{l[NR%n]=$0};END{for(i=NR-n+1;i<=NR;i++)if (i in p) print l[i%n]}'
次のように入力すると:
1
2
3
4
blah1
5
6
blah2
blah3
7
8
9
10
最初のものは以下を提供します。
2
blah1
blah1
blah2
blah2
5
blah3
8
9
そして2番目は次のように印刷されます。
2
blah1
5
blah2
blah3
8
9