
ファイルの先頭からパターンの 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
。