将模式之间的记录转换为每行一个记录

时间:2016-02-19 11:13:10

标签: regex awk sed multiline

我有一个看起来像这样的文件:

----------------------------------------------------------
Record                                                : 1
SomeValue                                             : foo1
SomeOtherValue                                        : bar1
NthValue                                              : 1234

----------------------------------------------------------
Record                                                : 2
SomeValue                                             : foo2
SomeOtherValue                                        : bar2
NthValue                                              : 2234

----------------------------------------------------------
Record                                                : 1
SomeValue                                             : foo3
SomeOtherValue                                        : bar3
NthValue                                              : 3234

我想转换它,以便每条记录(由破折号字符串分隔)生活在它自己的行上:

Record : 1 SomeValue : foo1 SomeOtherValue : bar1 NthValue : 1234
Record : 2 SomeValue : foo2 SomeOtherValue : bar2 NthValue : 4321
Record : 1 SomeValue : foo3 SomeOtherValue : bar3 NthValue : 0000

我不能为我的生活解决如何使用简单的命令来执行此操作而无需使用脚本。这里的任何帮助将不胜感激。

顺便说一句,分隔符字符串总是相同的,但每条记录中字段的数量和大小可能会有所不同。

1 个答案:

答案 0 :(得分:1)

gawk通过重新计算字段来自行完成:

gawk -v RS="----------------------------------------------------------" '{$1=$1} NF>1' file

或者,正如Ed Morton建议的那样,将RS设置为多个-

gawk -v RS="-+" '{$1=$1} NF>1' file

在这两种情况下,你都会得到:

Record : 1 SomeValue : foo1 SomeOtherValue : bar1 NthValue : 1234
Record : 2 SomeValue : foo2 SomeOtherValue : bar2 NthValue : 2234
Record : 1 SomeValue : foo3 SomeOtherValue : bar3 NthValue : 3234

当您更改记录中的字段时,awk重建$0,取出所有字段并将它们连接在一起,由OFS分隔,OFS默认为空格。