パターンに一致する各行のN行目を削除します。

パターンに一致する各行のN行目を削除します。

同じディレクトリに複数のファイル(たとえばfile1、... etc)があり、各ファイルに複数行の一致を含めることができます。各行から最初の行を削除したい(例:match =とcontent)。file2PATTERN
NPATTERNN3file1

1 no match
2 PATTERN
3 same PATTERN
4 no match here
5 no match here either
6 another PATTERN
7 again, no match
8 no
9 last line

予想される出力は次のとおりです。

1 no match
2 PATTERN
3 same PATTERN
4 no match here
7 again, no match
8 no

ファイルを適切に編集することは必須ではなくボーナスです(ただし、gnuすべてのファイルを一度に編集できるツールを1つ以上知っていますが...)。


似たような質問をした人がいます。ここしかし、これは特別なケースです。各ファイルの1行だけがパターンに一致し、そこの解決策は、少なくとも次のように表される場合、パターンに一致する複数の行に対してのみ機能します。窒素一致しない行の場合は+1)。

ベストアンサー1

私はあなたawkが次のように使用できると信じています:

awk -vN=3 '/PATTERN/ {skips[FNR+N]=1;} {if(!(FNR in skips)) print;}' <file>

したがって、クリックするたびにPATTERNここに行を記録し、スキップされていない行のみをN印刷します。

-i inplacegawkを使用すると、内部で行うこともできます。

指摘したように、これは複数のファイルを処理しません。もちろん、forループを使用してすべてのファイルを繰り返すことはできますが、ファイルが不足しているため、コマンドラインを長くすることもできます。

 awk -vN=3 '{if(FNR==1) split("", skips, ":");} /PATTERN/ {skips[FNR+N]=1;} {if(!(FNR in skips)) print;}' *

skips1に達するたびに、FNR各ファイルの先頭である空の配列にリセットされます。次のように書くことができます
gnu awk

gawk -i inplace 'FNR==1{delete nr};/PATTERN/{nr[FNR+3]++};!(FNR in nr)' file*

おすすめ記事