将多行内容收集到一个输出中

将多行内容收集到一个输出中

假设我有一个包含大量内容的文本文件,包括如下行:

...    
...
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之前删除一行?这样我就可以将一根线上的数据通过管道传输到?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

相关内容