如何比较不同文件中的列并替换一列中的值?

时间:2019-05-24 17:01:27

标签: linux awk

我有两个文件:

input1

22 rs145072688 14431347  C  G 0.3418 0.648 0.830 0.516 0.506 0.497 0.785 0.586
22   rs201725126 14432618  G  A 0.8119 1.571 1.748 1.661 1.384 1.374 1.614 1.718
22   rs200579949 14433624  G  A 0.8598 1.590 1.669 1.763 1.754 1.832 1.627 1.250
22   rs75454623 14433659  C  A 0.7888 1.564 1.606 1.667 1.355 1.619 1.692 1.775
22   rs199856693 14433758  G  A 0.9354 1.807 1.936 1.906 1.847 1.929 1.734 1.327
22  rs9604721 14434713  C  T 0.9723 1.984 1.984 1.984 1.984 1.984 1.878 1.412

input2

rs145072688:10352:T:TA rs145072688
rs201725126:13116:T:G rs201725126
rs200579949:13118:A:G rs200579949
rs75454623:14930:A:G rs75454623
rs199856693:14933:G:A rs199856693

所需的输出:

22 rs145072688:10352:T:TA 14431347  C  G 0.3418 0.648 0.830 0.516 0.506 0.497 0.785 0.586
22   rs201725126:13116:T:G 14432618  G  A 0.8119 1.571 1.748 1.661 1.384 1.374 1.614 1.718
22   rs200579949:13118:A:G 14433624  G  A 0.8598 1.590 1.669 1.763 1.754 1.832 1.627 1.250
22   rs75454623:14930:A:G 14433659  C  A 0.7888 1.564 1.606 1.667 1.355 1.619 1.692 1.775
22   rs199856693:14933:G:A 14433758  G  A 0.9354 1.807 1.936 1.906 1.847 1.929 1.734 1.327
22  rs9604721 14434713  C  T 0.9723 1.984 1.984 1.984 1.984 1.984 1.878 1.412

因此,如果两个文件的第二列都匹配,我想用输入2中第一列中的值替换文件input1中第二列中的值。

我尝试过:

awk 'FNR==NR{a[$1]=$2;next} $2 in a{$2=a[$1]}1' input2 input1

还有这个

awk 'FNR==NR { F2[$2]=$2 ; next } $2 in F2 {$1 = F2[$1] ; print } ' input2 input1

1 个答案:

答案 0 :(得分:0)

您的第一次尝试几乎是正确的。

awk '
    FNR==NR { a[$2]=$1; next }
    $2 in a { $2=a[$2] }
    1
' input2 input1
  • $2 in a在a的键中查找$ 2,而不是在其值中查找
  • 因此将第2列存储为值,而不是a的键
  • 在第二行操作中,您应该引用(input1的)第二列而不是(input2的)第一列