Bashでn番目の発生後に複数行を印刷します。

Bashでn番目の発生後に複数行を印刷します。

n番目のパターン発生を検索し、パターンの後にk行を印刷する方法を探しています。この状況awkよりは良いと思いますが、grepどうすれば正しくできるのかわかりませんね…。

次のテキストファイルがあるとしましょう。

Draft  
blablablabla  
tralalalalala  
Draft  
blablablabla  
tralalalalala  
Draft  
important line 1  
important line 2  
Draft   
blablablabla   
tralalalalala  

この例では、n=3k=2Draft」パターンが3番目に表示された後に2行を印刷したいと思います。私の特別なケースでは、nとkが異なる場合があります。

これは簡単な方法ですか?

答え1

Perlが構造に来ます:

 perl -sne '$c++ if /Draft/;
            if ($c == $n) { print scalar <> for 1 .. $k; }
           ' -- -n=3 -k=2 < input
  • -sスイッチを解析して-n=3変数を作成します。
  • -n入力を1行ずつ読みます。
  • <>ダイヤモンド演算子は入力から読み取られます。
  • スカラー入力から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

関連情報