パターンに一致するn番目の行と次のN行を抽出します。

パターンに一致するn番目の行と次のN行を抽出します。

ファイルに規則的に繰り返されるパターンを含む大容量ファイルがありますが、特定の値が発生した後に特定のパターンのみを抽出し、次の値を抽出したいと思います。窒素いいですね。
ここに例がありますが、前の数字はmembers of the group実際には存在しません。

入力する:

1 members of the group
...
...
2 members of the group
...
...
...
n members of the group
...
...
...

出力:

85 members of the group
...
...
...
...
...

(ゲーム85と次の5行)

ベストアンサー1

方法は次のとおりですawk

awk -vN=85 -vM=5 'BEGIN{c=0}
/PATTERN/{c++
{if (c==N) {l=NR;last=NR+M}}
}{if (NR<=last && NR>=l) print}' infile

Nどこに窒素最初の行は次の行の数とPATTERN一致します。M次の場合にカウンタを設定します。窒素行3で一致するものが見つかったら、行番号を保存します。次に、現在から+NRまで行を印刷します。NR中サイズ


記録によると、sedgnu sed構文)の使用方法は次のとおりです。

sed -nE '/PATTERN/{x;/\n{84}/{x;$!N;$!N;$!N;$!N;$!N;p;q};s/.*/&\n/;x}' infile

これは計算にアーカイブスペースを使用します。
一致する行が現れるたびに、PATTERNeはxバッファを変更し、その行があるかどうかを確認します。N-1\nバッファに改行文字を保持します。検査が成功するとx再び変更され、次の項目がインポートされます。中サイズ$!Nコマンドを使用してpパターンスペースを印刷し、quitsを印刷します。
それ以外の場合は、\n予約済みスペースに別のewline文字を追加してからx再度変更します。
このソリューションはすぐに面倒になる可能性があるため、あまり便利ではありません。中サイズは大きな数値で、スクリプトをprintf書くには少し-fuが必要ですsed(パターンは言うまでもなく、sedスペースを制限するためにいくつかのsを使用します)。

おすすめ記事