2017-01-16 16 views
0

我得到了一些問題,這些基本數據:AWK - 在下一條記錄上使用GETLINE?

DP;DG 
67; 
    ;10 
    ;14 
    ;14 
    ;18 
    ;18 
    ;22 
    ;65;x 
68; 
    ;0 
    ;9 
    ;25 
    ;25;x 
70; 

的「X」值來如果在下一行$ 1:

DP;DG 
67; 
    ;10 
    ;14 
    ;14 
    ;18 
    ;18 
    ;22 
    ;65 
68; 
    ;0 
    ;9 
    ;25 
    ;25 
70; 

,我想在這種輸出的變換存在或者如果$ 2爲空。根據我的理解,我必須使用getline,但是我不明白! 我試過以下代碼:

#!/bin/bash 

file2=tmp.csv 
file3=fin.csv 

awk 'BEGIN {FS=OFS=";"} 

{ 
    print $0; 
    getline; 
    if($2="") {print $0";x"} 
    else {print $0} 

}' $file2 > $file3 

看起來很簡單。我沒有提到結果,與我的期望完全不同。

一些線索? getline是否需要解決這個問題?

OK,我繼續測試一些代碼:

#!/bin/bash 

file2=tmp.csv 
file3=fin.csv 

awk 'BEGIN {FS=OFS=";"} 

{ 
    getline var 
    if (var ~ /.*;$/) { 
     print $0";x"; 
     print var; 
     } 
    else { 
     print $0; 
     print var; 
     } 

}' $file2 > $file3 

這是相當好了,不過,這應標明所有的線條都沒有...我不知道爲什麼...

+0

'從我的理解中,我必須使用getline'。不,讀有效AWK編程,第4版,由阿諾德·羅賓斯學習如何用awk和閱讀http://awk.freeshell.org/AllAboutGetline學習幾次它是適合使用函數getline和所有的注意事項和理由不至。 –

回答

1

替代一通版本

$ awk -F\; 'NR>1 {printf "%s\n", (f && $2<0?"x":"")} 
       {f=$1<0; printf "%s", $0} 
      END {print ""}' file 
+0

我想OP在下一行'$ 2 <0'時需要一個x,並且應該存儲在布爾'f'中。在處理第二行時打印'x \ n'的方法很聰明,並且使得我的(未發佈的)'tac | awk ... | tac'荒謬。請注意,有時您想附加'; x \ n'。 –

1

給這個只有一行一試:

awk -F';' 'NR==FNR{if($1>0||!$2)a[NR-1];next}FNR in a{$0=$0";x"}7' file file 

awk -F';' 'NR==FNR{if($1~/\S/||$2)..... 
相關問題