一致する行と一致する行(私が探している式を含む行)内の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行目を印刷するだけです。
答え1
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の解決策は本質的に同じ方法で動作する。ただし、eに会うと、その行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
答え2
一致する行の後に何行を印刷するかを指定する-A
オプションを試すことができます。grep
これを組み合わせることで、sed
目的の行を取得できます。
grep -A 4 pattern input.txt | sed -e '2,4d'
を使用してsed
2行目から4行目まで削除します。
答え3
sed -n 's/^[ \t]*/; /img class=\"devil_icon/,+4 { 3,5d ; p }' input.txt
印刷する前にその行を削除してください{ 3,5d ; p }
。
答え4
awk 'c&&!--c;/img class=\"devil_icon/{c=4};/img class=\"devil_icon/' input.txt
本質的に検索と置換を行っています。ただ追加するだけです探す同じコマンドに入力すると印刷されます:)
awk 'c&&!--c;/pattern/{c=4};/pattern/' input.txt