2

我想执行以下操作,但不知道如何在 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

4 回答 4

3

试试这一行:

awk 'NF<4{printf "%s", $0;next}1' file
于 2013-03-13T09:51:24.020 回答
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% 正确的答案。

于 2013-03-13T11:35:41.980 回答
1

这个 awk 将为您工作:

awk '{if (pre!="") {print pre $0; pre=""} else if (NF>=4) print; else pre=$0}' in.file
于 2013-03-13T09:54:05.553 回答
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
>
于 2013-03-13T09:56:39.107 回答