2017-01-16 15 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)..... 
相关问题