首页 > 解决方案 > 将一个文件中的两列与另一个文件中的两列相匹配,并从第一个文件中返回另一列

问题描述

我需要将文件 1 中的第 2 列和第 5 列与第二个文件中的第 2 列和第 4 列进行匹配。如果匹配,则在文件 2 中返回一个新列,其中包含来自文件 1 的第 4 列的值。

文件_1

10  43572716    43572935    22  AMP
10  43572716    43572935    26  DEL
18  48578898    48579056    71  DEL

文件_2

10  43572716    43572935    DEL 1   RET -0,5    0,51    218,164 0,58    255,89  0,73    0,79    0,85
18  48578898    48579056    DEL 1   SMAD4   -0,9    0,23    8,70886 0,02    16,665  0,05    0,4 0,52

File_2 包含更多列

我已经尝试了下面的代码,但它返回了整个文件

awk 'FNR==NR{a[$2 FS $5]=$0;next} (($2 FS $4) in a) {print a[$2 FS $4],$0}' file_1.bed FILE_2.bed

预期结果是

10  43572716    43572935    DEL 1   RET -0,5    0,51    218,164 0,58    255,89  0,73    0,79    0,85    26
18  48578898    48579056    DEL 1   SMAD4   -0,9    0,23    8,70886 0,02    16,665  0,05    0,4 0,52 71

有人可以帮忙吗?

标签: bashawkmatch

解决方案


你很接近,你能试试跟随吗?

awk 'FNR==NR{a[$2,$5]=$4;next} ($2,$4) in a{print $0,a[$2,$4]}' Input_file1 Input_file2

添加非单线形式的解决方案,如下所示:

awk '
FNR==NR{
  a[$2,$5]=$4
  next
}
($2,$4) in a{
  print $0,a[$2,$4]
}
' Input_file1  Input_file2


为什么 OP 的代码不起作用: OP 在完成此操作的逻辑方面很接近,唯一的问题是在读取 Input_file1 尽管a[$2 FS $5]=$0它应该是a[$2 FS $5]=$4并且在第二个 Input_fie 上打印它时读取它应该是print $0,a[$2 FS $4]。我在上面的代码中修复了它。


推荐阅读