【问题标题】:AWK Print fields with new values if match, else print lineAWK 如果匹配则打印具有新值的字段,否则打印行
【发布时间】:2017-09-01 13:25:08
【问题描述】:

我有两个文件 - 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

文件A

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  

文件B

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**

【问题讨论】:

  • 请发布FileAFileB的样本以及预期的输出。谢谢。
  • 请阅读MCVE并遵守它,否则可能会被忽视
  • 不是重复的。有人评论了最后一个帖子并说要创建一个新帖子...我只是按照我的指示做...
  • @user3746195:好的

标签: awk


【解决方案1】:

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

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

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

$ 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

【讨论】:

  • 考虑在前面设置一次{idx=$1 FS $2},然后在任何地方使用idx,而不是在三个地方硬编码$1 FS $2
猜你喜欢
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2017-04-30
  • 2021-10-30
  • 2015-04-25
相关资源
最近更新 更多