awk:如果少于5列,则将行附加到上一行

时间:2017-03-21 02:30:36

标签: bash awk

我有一个混乱的输入文件,它有意想不到的换行符。它标签分隔的文件。由于一些列是文本数据,我认为awk是一个不错的选择,但我并不精通它。

虽然每行应该有N列,但是有不正确的换行符,而且许多行的列数较少。这是一个虚拟的例子,

a1  a2  a3  a4  a5
b1  b2  b3  b4  b5
c1  c2  c3
c4  c5
d1  d2  d3
d4
d5
e1  e2  e3  e4  e5

[请注意,实际开始行时,列数永远不会少于3列。你永远不会有这样的休息,f1 f2 \n f3 f4 f5]

所以我想删除不正确的换行符并让它看起来像这样,每行有5列,

a1 a2 a3 a4 a5
b1 b2 b3 b4 b5
c1 c2 c3 c4 c5
d1 d2 d3 d4 d5
e1 e2 e3 e4 e5

所以如果列少于3列,我需要一种方法将一行添加到前一行。或者在下一行附加一行并更新NF,以便重复追加,直到有5列 我尝试编辑" awk' NF< 4 {printf"%s",$ 0; next} 1'文件"附加到上一行,但不起作用。
有什么想法吗?

2 个答案:

答案 0 :(得分:4)

gawk

awk -v RS='[ \n]+' 'ORS=NR%5?FS:"\n"' file

a1 b1 c1 d1 e1
a2 b2 c2 d2 e2
a3 b3 c3 d3 e3
a4 b4 c4 d4 e4
a5 b5 c5 d5 e5

假设数据以空格分隔,将记录分隔符设置为空格或换行将所有字段标记为记录,NR计算记录,并在每个第5条记录(其中NR/5变为零)后插入换行符通过设置输出记录分隔符ORS,否则在字段之间使用字段分隔符FS,默认为空格。

答案 1 :(得分:3)

使用xargs

<强>输入

$ cat file
a1  a2  a3  a4  a5
b1  b2  b3  b4  b5
c1  c2  c3
c4  c5
d1  d2  d3
d4
d5
e1  e2  e3  e4  e5

<强>输出

$ xargs -n 5 < file
a1 a2 a3 a4 a5
b1 b2 b3 b4 b5
c1 c2 c3 c4 c5
d1 d2 d3 d4 d5
e1 e2 e3 e4 e5