使用awk在两个文件中基于公共密钥合并两个文件

时间:2016-08-22 12:49:55

标签: awk merge

我是一个初学者,如果之前已经介绍过,请道歉,但我似乎无法找到我需要的东西。我试图根据两个文件中的公共列合并两个文件。

文件1

2:16641345_T_C -6.7483 49.4866 0.8915
3:14503229_A_C 1.5627 1.2460 0.2098
8:13381223_AT_A -0.0255 0.7766 0.9738
13:58575029_G_A 8.4617 64.4474 0.8955
2:203233108_A_C -7.5032 63.4653 0.9059
22:35773673_G_C -0.6282 1.2473 0.6145
4:76220798_A_T -0.0413 0.0459 0.3682
2:106567150_T_C 0.0011 0.0471 0.9819
3:68098578_T_C 0.0169 0.0429 0.6934

file2的

2:16641345_T_C C T 6.53133e-05
3:14503229_A_C C A 0.000297125
8:13381223_AT_A A AT 0.000773358
13:58575029_G_A A G 0.000320199
2:203233108_A_C C A 0.000158051
22:35773673_G_C C G 0.000446161
4:76220798_A_T T A 0.339496
2:106567150_T_C C T 0.298242
3:68098578_T_C C T 0.52789

第一列在两个文件中都是通用的。所需的输出是:

输出

2:16641345_T_C  C T 6.53133e-05 -6.7483 49.4866 0.8915
3:14503229_A_C C A 0.000297125  1.5627 1.2460 0.2098
etc...

我尝试过以下操作,但它只给出了输出中文件2的第二列:

awk 'NR==FNR{a[$1]=$2;next} ($1) in a{print $0, a[$1]}' file1 file2
2:16641345_T_C C T 6.53133e-05 -6.7483
3:14503229_A_C C A 0.000297125 1.5627

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

只需将第一列替换为另一个文件中的相应行:

awk 'FNR==NR {data[$1]=$0; next} {$1=data[$1]}1' f2 f1

你也可以像这样使用join,告诉它根据两个文件的第一个字段粘贴:

join -1 1 -2 1 f2 f1
join -j 1 f2 f1        # -j is equivalent to -1 FIELD -2 FIELD
join f2 f1             # The default join field is the first /
                       #   delimited  by whitespace

即使在调用sort之前最好join文件,所以正确的解决方案是:

join <(sort f2) <(sort f1)

以上所有命令都会根据您的输入返回以下内容:

2:16641345_T_C C T 6.53133e-05 -6.7483 49.4866 0.8915
3:14503229_A_C C A 0.000297125 1.5627 1.2460 0.2098
8:13381223_AT_A A AT 0.000773358 -0.0255 0.7766 0.9738
13:58575029_G_A A G 0.000320199 8.4617 64.4474 0.8955
2:203233108_A_C C A 0.000158051 -7.5032 63.4653 0.9059
22:35773673_G_C C G 0.000446161 -0.6282 1.2473 0.6145
4:76220798_A_T T A 0.339496 -0.0413 0.0459 0.3682
2:106567150_T_C C T 0.298242 0.0011 0.0471 0.9819
3:68098578_T_C C T 0.52789 0.0169 0.0429 0.6934