
尋找命令列工具(awk、sed 等)指令來省略從檔案開頭到模式第 n 次出現的行。換句話說,僅列印從第 n 次出現的模式到文件末尾的內容。假設每行一場比賽;線不一定以模式開頭。
例如,省略以下從文件開頭到第二個的foo
內容:
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
是多少次,然後就需要一個要列印的flag;匹配時遞減,如果遞減足夠NTH
則啟用列印。NTH
移動print
到終點去捕捉最終想要的東西foo
。