次の2行のパターンをgrepし、1行のパターンを破棄します。

次の2行のパターンをgrepし、1行のパターンを破棄します。

次のようなファイルがあります:

dn: ダナン

cn: ダニアン

cn: ダニアン1


dn: ダニアン2

cn: ダニアン2


dn: ダニアン3

cn: danian3

cn: danian4

私がやりたいのは、パターン「dn:」をgrepして次の2行だけを印刷することだけですが、grep -A 2 "dn:"を実行すると、結果にはファイル内のすべてのものが表示されます。次の1行ではなく、次の2行を印刷したいだけです。

答え1

これはうまくいくかもしれません:

$ awk -v RS="dn: " -v FS="\n" -v ORS="" 'NF>3 {print "dn:",$0}' input.txt

をレコード区切り文字として定義しますdn:。1 つのレコード内のフィールドは、改行文字によって区切られます\n

で始まる行の後に 2 行続く場合dn:、新しいレコードが で始まる前にdn:、レコードに 4 つのフィールドの先頭に 3 回の "\n" が続くことになります。これが、レコードに 3 つ以上のフィールドがあるかどうかをチェックする理由です ( NF>3)。その場合、レコード全体を出力しますが、 を先頭に追加する必要がありますdn:

NF>3は、1 つのレコードに 2 行以上の後続行を持つすべてのレコードを検索することに注意してください。正確に 2 行を持つレコードのみが必要な場合は、 に変更しますNF==3

ブロックが空白行で区切られている場合 (後のコメントの 1 つに見られるように)、代わりにこれを使用します。

$ awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}' input.txt

答え2

上記のコマンドを実行すると完璧に動作します。

awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}' 

区切られたブロックは空白で、完璧に動作します。

関連情報