我有一个文件,我们称之为test.txt,格式如下:
1|2|3|4| 1|2|3|4| 1|2| 3|4| 1|2|3|4| 1|2|3|4|
您将看到第三行已被拆分为2行,我需要能够处理该文件,以便重新连接所有这些事件,从而导致:
1|2|3|4| 1|2|3|4| 1|2|3|4| 1|2|3|4| 1|2|3|4|
我一直试图通过首先获取每一行的管道数量来实现这一目标:
cat test.txt | awk -F'|' '{print NF -1}
我希望能够做的是扩展这一点,使得任何与指定数量的管道不匹配的行(在本例中为4)连接到下一行,直到它们为止。
有人能指出我正确的方向吗?感谢。
答案 0 :(得分:3)
你可以稍微玩一下字段数:
awk -v FS="|" '{printf "%s%s", $0, (f+NF<5?"":RS); f+=NF} f>=5 {f=0}' file
这会将字段分隔符设置为|
,并从中继续计算到目前为止已打印的字段数。如果数字低于5,则保持打印在同一行;否则,打印一个新行。
对于像
这样的输入文件$ cat a
1|2|3|4|
1|2|3|4|
1|2|
3|4|
7|2|3|4|
1|2|3|4|
1|
2|
3|4|
见输出:
$ awk -v FS="|" '{printf "%s%s", $0, (f+NF<5?"":RS); f+=NF} f>=5 {f=0}' a
1|2|3|4|
1|2|3|4|
1|2|3|4|
7|2|3|4|
1|2|3|4|
1|2|3|4|