如果来自不同文件的两列相等,则用awk替换第三列

时间:2017-09-05 06:27:58

标签: awk

如果两个ID列匹配,我正在寻找替换文件中的列的方法。 我有档案A.txt

c   a   b   ID
1  0.01 5   1
2  0.1  6   2
3       2   3

和档案B.txt

ID   a   b
1   10   15
2   20   16
3   30   12
4   40   14

我正在寻找的输出是 档案A.txt

ID a    b   
1  0.01 5   
2  0.1  6   
3   30  2   

我可以使用awk找到两个文件中的ID列匹配

awk 'NR==FNR{a[$1];next}$1 in a' B.txt A.txt

但是如何添加替换品。感谢您的任何建议。

2 个答案:

答案 0 :(得分:0)

awk 解决方案:

awk 'NR==FNR{ if(NR>1) a[$1]=$2; next }
     FNR>1 && $1 in a && NF<3{ f=$2; $2=a[$1]; $3=f }1' B.txt A.txt | column -t
  • if(NR>1) a[$1]=$2; - 捕获文件B.txt中的列值,但标题行(N>1

  • 除外
  • FNR>1 && $1 in a && NF<3 - 如果ID匹配并且A.txt中的某些行少于3个字段

输出:

ID  a     b
1   0.01  5
2   0.1   6
3   30    2

答案 1 :(得分:0)

适应您的新数据格式

awk '
   # Load file b reference
   FNR==NR && NR > 1 {ColB[$1]=$2; next}

   # treat file A
   {
   # set missing field if know in file B (and not 1st line)
   if ( NF < 4 && ( $NF in ColB) && FNR > 1) $0 = $NF FS ColB[$NF] FS $2

   # print result (in any case)
   print
   }

   #order of file is mandatory' B.txt A.txt

自我记录。 假设这只是样本中缺少的第二个字段