【问题标题】:Merge two file based on a common key in both files using awk使用 awk 基于两个文件中的公共密钥合并两个文件
【发布时间】:2016-08-23 00:57:58
【问题描述】:

我是一个初学者,如果之前已经介绍过,我深表歉意,但我似乎无法准确找到我需要的东西。我正在尝试基于两个文件中的公共列合并两个文件。

文件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

文件2

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

提前感谢您的帮助!

【问题讨论】:

  • 你可以在没有awk的情况下使用join命令,比如join file2 file1。

标签: awk merge


【解决方案1】:

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

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

尽管在调用join 之前最好先sort 文件,但正确的解决方案是:

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

【讨论】:

  • @VanishaMistry 很高兴阅读!请记住,如果它解决了您的问题,您可以接受答案。
  • 你不需要明确的-j1 join 这是默认的。文件需要排序。
  • @karakfa 哦,太好了,那就更短了。已更新,非常感谢
  • 正如@karakfa 指出的那样,join 在不先对文件进行排序的情况下将无法工作,例如join &lt;(sort file2) &lt;(sort file1) 然后输出将不在输入顺序中。或者在这种情况下,由于输入是逐行连接的,您可以使用paste file2 &lt;(cut -f2- file1)
  • 许多人使用 for (i in array) print i 编写 awk 脚本,并认为当他们以数组索引的数字顺序获得输出时一切都很好,然后当我告诉他们这只是巧合时有时会争论它(例如,参见cmets 关于stackoverflow.com/a/39065382/1745001 下的procinfo)。我的观点是,如果您选择不执行手册页告诉您的操作,那么从一个输入集获得您期望的输出并不意味着该解决方案适用于其他输入集或其他工具版本或其他平台.也许它会,idk ;-)。
猜你喜欢
  • 2016-01-16
  • 1970-01-01
  • 2012-08-23
  • 2014-07-12
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
相关资源
最近更新 更多