使用awk在条件下连接两行

使用awk在条件下连接两行,awk,concatenation,end-of-line,Awk,Concatenation,End Of Line,当fiel的数目与给定的数目不匹配时,我尝试连接两行 以下是输入文件的示例: 1, z 2 3 4 5, w 6 7 这是我想要的结果: 1, z 2 3 4 5, w 6 7 我尝试了以下代码: awk ' { if (NF!=1){ first=$0 getline print first" ",$0} else {print $0} }' $1 以下是我得到的: 2 z 3 4 6 w 7 我不明白为什么我先得到下一行,然后只得到第一行的第二个字段

当fiel的数目与给定的数目不匹配时,我尝试连接两行

以下是输入文件的示例:

1, z
2
3
4
5, w
6
7
这是我想要的结果:

1, z 2
3
4
5, w 6
7
我尝试了以下代码:

awk '
{
   if (NF!=1){
   first=$0
   getline
   print first" ",$0}
   else {print $0}
}' $1
以下是我得到的:

 2 z
3
4
 6 w
7
我不明白为什么我先得到下一行,然后只得到第一行的第二个字段。

尝试这样做:

awk 'NF!=1{printf "%s ", $0;next}1' file
输出:

1, z 2
3
4
5, w 6
7
这可以做到:

awk '{printf "%s%s",$0,(NF>1?FS:RS)}' file
1, z 2
3
4
5, w 6
7

如果有一个字段和一个空白字段(字段分隔符),它将打印换行符

$ awk 'ORS=NF == 1?"\n":FS' input
1, z 2
3
4
5, w 6
7
  • ORS
    是输出字段分隔符

  • FS
    字段分隔符,默认为空格

  • NF==1?”\n:FS'
    如果
    NF
    ,字段数等于
    1
    ,则
    ORS
    设置为
    \n
    否则设置为
    FS


谢谢。但奇怪的是,根据您的建议,我得到的输出与我在问题中提到的完全相同(错误)。@bosonfute您的输入文件的格式可能与问题中的格式不同。请查收that@bosonfute我已经在GNU Awk 3.1.5中测试了这个脚本,但是它在那里工作得很好:/谢谢。怪异:我尝试了另一个虚拟机。这里提供的所有解决方案,包括我的问题,都给出了正确的输出。在我自己的电脑上,所有的东西都给出了错误的输出(我问题中的那个)。我没有一个奇怪的发行版:LinuxMint(Debian)和awk版本是GNUAWK4.0.X。在虚拟机上,它是3.1.7。可能是awk版本的问题。谢谢。但奇怪的是,根据你的建议,我得到的结果与我在问题中提到的完全相同(错误)。@bosonfute那么你的数据与你在这里发布的数据不同。PS不使用
getline
。谷歌
为什么不使用getline
你就会明白为什么了。谢谢。很高兴了解getline。我现在会小心的。我仍然认为我的问题是由于awk版本,正如我在回复nu11p01n73R时提到的。我添加了隐藏在某处的
^M
字符。我应该知道!!!