2014-12-02 61 views
0

我试图串联两条线,当fiels的数量与给定数字不匹配时。Сoncatenate与awk条件下的两条线

这里是输入文件的例子:

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 

我不明白为什么我先得到下一行,然后只有第一行的第二个字段。任何人都可以帮助我理解吗?

+0

我添加隐藏在某处的'^ M'字符。我早该知道!!! – bosonfute 2014-12-12 08:57:45

回答

0

一个更短的版本将是

$ 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

+0

谢谢。但奇怪的是,使用你的建议,我得到了与我在问题中提到的完全相同(错误)的输出。 – bosonfute 2014-12-02 07:21:32

+0

@bosonfute很可能是您的输入文件可能无法正确格式化,如问题所示。请检查 – nu11p01n73R 2014-12-02 07:23:28

+0

@bosonfute我已经测试过'GNU Awk 3.1.5'中的脚本,但它工作正常,但:/ – nu11p01n73R 2014-12-02 07:25:31

0

试着这样做:

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

输出:

1, z 2 
3 
4 
5, w 6 
7 
0

这可能会做:

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

它打印换行,如果有一个领域,其他人一个空白(字段分隔符)

+0

谢谢。但奇怪的是,使用你的建议,我得到了与我在问题中提到的完全相同(错误)的输出。 – bosonfute 2014-12-02 07:22:10

+0

@bosonfute然后你indata与你在这里发布的内容不同。 PS不使用'getline'。 Google'为什么不使用getline',你明白为什么。 – Jotne 2014-12-02 07:24:03

+0

谢谢。很高兴知道getline。我现在要小心了。不过我认为我的问题是由awk版本引起的,正如我在我对nu11p01n73R的回复中提到的。 – bosonfute 2014-12-02 13:58:27