我想做以下但不知道如何在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
....
答案 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
>