Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash awk:如果少于5列,则将行追加到前一行_Bash_Awk - Fatal编程技术网

Bash awk:如果少于5列,则将行追加到前一行

Bash awk:如果少于5列,则将行追加到前一行,bash,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] 所以我想

我有一个凌乱的输入文件,有意外的换行。该文件由选项卡分隔。由于有些列是文本数据,我认为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列。
我试着用
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
统计记录,并在每个第五条记录之后(其中
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
输出

$ 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
$xargs-n5
这个解决方案在概念上非常简单,但是请注意,每5个输入字段都会创建一个子进程-
/bin/echo
,这对于大型输入文件来说可能会成为一个问题。另外请注意,
xargs
将“吃掉”输入中的单个
\
实例;e、 例如,
echo'a\b'| xargs
产生
ab
@mklement0:是的,我同意,虽然稍微复杂一些,但对于大输入集,此解决方案的性能要比
xargs
解决方案好得多。如果输入是以制表符分隔的,如OP的情况,请使用
'[\t\n]'
而不是
[\n]+