2014-12-02 64 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