我是一个初学者,如果之前已经介绍过,请道歉,但我似乎无法找到我需要的东西。我试图根据两个文件中的公共列合并两个文件。
文件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
提前感谢您的帮助!
答案 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