awk:如果少于 5 列,则在上一行后附加行

  • 本文关键字:一行 如果 awk 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' 文件"以附加到上一行,但这不起作用。
有什么想法吗?

with 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使用字段分隔符,默认情况下为空格。

使用 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

最新更新