AWK如果匹配则打印带有新值的字段,否则打印行

时间:2017-09-01 13:25:09

标签: awk

我有两个文件 - FileA和FileB。 FileA将被更改。 FileB包含新值。 FileB有3个字段。前两个字段将与FileA的前两个字段进行比较。如果字段匹配,则应更改Field3。下面的代码以这种方式工作:"如果两个值匹配,则更改field3并打印该行。如果没有匹配,则下一步。"我想要的行为是,"如果没有匹配,则打印不变的行。" "其他"部分代码无效,我尝试了很多变化。

awk -F'\t' -v OFS='\t' '
# first, read in data from file B
NR == FNR { values[$1 FS $2] = $3; next }

# then, output modified lines from matching lines in file A
($1 FS $2) in values { $3 = values[$1 FS $2]; print } else { print $0 }
' fileB fileA

FILEA

PROVDSRJ02.RD.RI    ae0.0   16      
PROVDSRJ02.RD.RI    ae1.1   1000    
PROVDSRJ02.RD.RI    ae2.0   5000    
PROVDSRJ02.RD.RI    ae3.0   5000    
ASHBBBRJ01.RD.AS    ae39.0  16      
ASHBBPRJ01.RD.AS    ae2.0   16      
ASHBBPRJ02.RD.AS    ae1.0   16      
ASHBBPRJ02.RD.AS    ae2.0   16      
ASHBBBRJ01.RD.AS    ae0.0   16      
ASHBBBRJ01.RD.AS    ae11.0  16  

FILEB

ASHBBBRJ01.RD.AS    ae10.0  524
ASHBBBRJ01.RD.AS    ae11.0  235
ASHBBBRJ01.RD.AS    ae39.0  2096
ASHBBBRJ01.RD.AS    ae6.0   183
ASHBBBRJ01.RD.AS    ae7.0   1141
ASHBBBRJ02.RD.AS    ae11.0  88
ASHBBBRJ02.RD.AS    ae13.0  333
ASHBBBRJ02.RD.AS    ae20.0  374
ASHBBBRJ02.RD.AS    ae9.0   1885

所需输出(**表示更改的行,不应包含在代码中)

PROVDSRJ02.RD.RI    ae0.0   16      
PROVDSRJ02.RD.RI    ae1.1   1000    
PROVDSRJ02.RD.RI    ae2.0   5000    
PROVDSRJ02.RD.RI    ae3.0   5000    
**ASHBBBRJ01.RD.AS    ae39.0  2096**    
ASHBBPRJ01.RD.AS    ae2.0   16      
ASHBBPRJ02.RD.AS    ae1.0   16      
ASHBBPRJ02.RD.AS    ae2.0   16      
ASHBBBRJ01.RD.AS    ae0.0   16      
**ASHBBBRJ01.RD.AS    ae11.0  235**

1 个答案:

答案 0 :(得分:2)

您的语法已关闭。查看tag info以获取一些学习资源。

在任何情况下,您都不需要else。您可以有条件地将$3设置为新值(正如您已经在做的那样),然后始终打印该行(可能已修改或未修改)。

在这里,我们使用快捷方式1始终打印该行。 1是一个始终为true的模式,它调用默认操作,即打印当前行。如果现在没有意义,那很快就会出现。

$ awk 'BEGIN {FS=OFS="\t"} 
       NR == FNR {values[$1 FS $2] = $3; next} 
       ($1 FS $2) in values {$3 = values[$1 FS $2]}1' fileB fileA
PROVDSRJ02.RD.RI    ae0.0   16
PROVDSRJ02.RD.RI    ae1.1   1000
PROVDSRJ02.RD.RI    ae2.0   5000
PROVDSRJ02.RD.RI    ae3.0   5000
ASHBBBRJ01.RD.AS    ae39.0  2096
ASHBBPRJ01.RD.AS    ae2.0   16
ASHBBPRJ02.RD.AS    ae1.0   16
ASHBBPRJ02.RD.AS    ae2.0   16
ASHBBBRJ01.RD.AS    ae0.0   16
ASHBBBRJ01.RD.AS    ae11.0  235