同じディレクトリに複数のファイル(たとえばfile1
、... etc)があり、各ファイルに複数行の一致を含めることができます。各行から最初の行を削除したい(例:match =とcontent)。file2
PATTERN
N
PATTERN
N
3
file1
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 inplace
gawkを使用すると、内部で行うこともできます。
指摘したように、これは複数のファイルを処理しません。もちろん、for
ループを使用してすべてのファイルを繰り返すことはできますが、ファイルが不足しているため、コマンドラインを長くすることもできます。
awk -vN=3 '{if(FNR==1) split("", skips, ":");} /PATTERN/ {skips[FNR+N]=1;} {if(!(FNR in skips)) print;}' *
skips
1に達するたびに、FNR
各ファイルの先頭である空の配列にリセットされます。次のように書くことができます
。gnu awk
gawk -i inplace 'FNR==1{delete nr};/PATTERN/{nr[FNR+3]++};!(FNR in nr)' file*