複数のラインを1つの出力として収集

複数のラインを1つの出力として収集

次の行を含む多くのコンテンツを含むテキストファイルがあるとします。

...    
...
ABCD1 1234 12345
XYZ
foo bar 1234597890
...
DEFG2 5678 56789
XYZ
foo bar 0987654321
...
...

を使用してデータシリーズを抽出して検索する必要がありますgrep -C1 "XYZ"。今私がすべきことは、次の出力を組み合わせることです。

ABCD1 1234567890 12345 1234
DEFG2 0987654321 56789 5678

grep -z "XYZ"「無関係」の行を削除し、行awkからデータを抽出して目的の方法で組み合わせることができることを知っています。しかし、私が見逃したものは、一致する行のプラス記号の前にある行をどのように削除できますか/n?では、1行から次の行にデータをパイプできますか?grepgrepawk

答え1

ですべての操作を実行する方がエレガントですが、素早く汚れたawk作業をしたい場合は、awkレコード区切り記号をgrepグループ区切り記号と同じに設定してから、必要なスペース区切り文字を任意の順序で印刷できます。

grep -C1 XYZ file | awk -vRS='\n--' '{print $1, $NF, $3, $2}'
ABCD1 1234597890 12345 1234
DEFG2 0987654321 56789 5678

関連情報