一致する行の前のn行、一致する行、一致する行の後のn行を印刷します。

一致する行の前のn行、一致する行、一致する行の後のn行を印刷します。

一致する行の前の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

おすすめ記事