ファイルの先頭からパターンのn番目までの出現を削除

ファイルの先頭からパターンのn番目までの出現を削除

ファイルの先頭からパターンの n 回目の出現までの行を省略するコマンド ライン ツール (awk、sed など) を探しています。言い換えると、パターンの n 回目の出現からファイルの末尾までのみを印刷します。1 行につき 1 つの一致があると想定します。行は必ずしもパターンで始まるとは限りません。

fooたとえば、次のファイルの先頭から 2 番目までを省略します。

something
abc foo1
maybe something else
foo2 -this line and anything before is gone- 
maybe not
foo3
something

望ましい結果:

maybe not
foo3
something

n 番目に出現する行を含めるか除外するとボーナス ポイントが付与されます。

答え1

除外するパターンのn番目の出現

awk -v 'n=3' 'NR == 1, /pattern/ && !--n {next}; 1'

(3必要な出現回数 (この場合は 2) とpattern実際のパターン (fooこの場合は ) に置き換えます)。

例:

$ seq 30 | awk -v 'n=3' 'NR == 1, /6/ && !--n {next}; 1'
27
28
29
30

含むパターンのn番目の出現

awk -v 'n=3' '/pattern/ && !--n, 0'

例:

$ seq 30 | awk -v 'n=3' '/6/ && !--n, 0'
26
27
28
29
30

答え2

% perl -ne 'BEGIN{$NTH=2;$p=0} print if $p; /foo/ && $NTH--; $p=1 if !$NTH' input
maybe not
foo3
something

NTH回かの場合、印刷フラグが必要になります。NTH一致した場合に減分し、NTH十分に減分された場合は印刷を有効にします。print最終的に望むものを捕まえるために最後まで移動しますfoo

関連情報