如果列小于4,则bash / awk追加下一行

时间:2013-03-13 09:46:04

标签: bash awk append

我想做以下但不知道如何在awk中这样做。如果列数小于4,我需要追加下一行(以便它与8列的行匹配)

aaa2 17 79285137 bbb3 0.23 A X 5
aaa2 17 79287477 
aaa2 1 F F 5 
aaa2 17 79291434 bbb33 1 G X 5
aaa2 17 79292215 bcs23 1 Q X 5
aaa22 4 4201745 
aaa22 1 C C 5
....

aaa2 17 79285137 bbb3 0.23 A X 5
aaa2 17 79287477 aaa2 1 F F 5 
aaa2 17 79291434 bbb33 1 G X 5
aaa2 17 79292215 bcs23 1 Q X 5
aaa22 4 4201745  aaa22 1 C C 5
....

4 个答案:

答案 0 :(得分:3)

试试这一行:

awk 'NF<4{printf "%s", $0;next}1' file

答案 1 :(得分:2)

(编辑:我恢复了更早的版本,否则将难以遵循..)

还有一个:

awk '{ORS=NF<4?x:RS}1' file

如果重新加入的句子部分之间不需要字段分隔符,则可以使用上述内容。这是一个引入空间的地方:

awk 'ORS=NF<4?FS:RS' file

即使上述选项适用于OP的示例输入,如果需要连接的行少于4个字段(例如,需要连接到一个的2 x 3字段的总行数),它们将会失败6个字段的行,与上面的示例不同)

这就是我添加此选项的原因:

awk 'NF<4{getline $(NF+1)}1' file

我看过Dimitre与Ed Morton的帖子的链接,但我认为在这种情况下,没有真正适用的getline警告。 NF不会更新的事实对于此应用程序来说不是问题。通常情况下,我会测试一个getline的成功,但是我把它留在这里,因为如果在最后一行中有少于3个字段,那么输入文件将被打破以开始,这里没有任何解决方案可以提供一个100%正确答案。

答案 2 :(得分:1)

这个awk适合你:

awk '{if (pre!="") {print pre $0; pre=""} else if (NF>=4) print; else pre=$0}' in.file

答案 3 :(得分:1)

awk '{if(NF<4){x=$0;f=1;next}if(f){$0=x" "$0;f=0};print}' your_file

测试:

> awk '{if(NF<4){x=$0;f=1;next}if(f){$0=x" "$0;f=0};print}' temp
aaa2 17 79285137 bbb3 0.23 A X 5
aaa2 17 79287477  aaa2 1 F F 5 
aaa2 17 79291434 bbb33 1 G X 5
aaa2 17 79292215 bcs23 1 Q X 5
aaa22 4 4201745  aaa22 1 C C 5
>