
n番目のパターン発生を検索し、パターンの後にk行を印刷する方法を探しています。この状況awk
よりは良いと思いますが、grep
どうすれば正しくできるのかわかりませんね…。
次のテキストファイルがあるとしましょう。
Draft
blablablabla
tralalalalala
Draft
blablablabla
tralalalalala
Draft
important line 1
important line 2
Draft
blablablabla
tralalalalala
この例では、n=3
「k=2
Draft」パターンが3番目に表示された後に2行を印刷したいと思います。私の特別なケースでは、nとkが異なる場合があります。
これは簡単な方法ですか?
答え1
答え2
awk:3番目と4番目の「ドラフト」行の間に行を印刷します。
awk -v n=3 '/Draft/ { p = (++num == n) ; next }; p' file
最適化する必要がある1つがあります。 4番目のドラフトに達すると終了することです。
答え3
grep
以下を使用してtail
これを達成できます。
$ n=3
$ k=2
$ grep -m "$n" -A "$k" 'Draft' input.txt | tail -n "$k"
important line 1
important line 2
$
grepオプションは、-m "$n"
最初の一致後に停止を指定n
し、grepに各一致後に1行を出力するように指示します-A "$k"
。k
その後、パイプを介して対応するラインのみをtail -b "$k"
出力k
します。
答え4
sed -ne'/^\(.*\n\)*Draft *$/G' \
-e's/\n/&/3;t$' -e'N;D;:$' \
-e's///g;//!n;N;G;s/\n//2' \
-etq -e/.$/b$ -e:q -e'p;q' <in >out
important line 1
important line 2