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

使用awk基于两个文件中的公共密钥合并两个文件,awk,merge,Awk,Merge,我是一个初学者,所以如果之前已经讨论过,我很抱歉,但我似乎找不到我真正需要的东西。我正试图根据两个文件中的一个公共列合并两个文件 文件1 文件2 第一列在两个文件中都是通用的。所需输出为: 输出 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==

我是一个初学者,所以如果之前已经讨论过,我很抱歉,但我似乎找不到我真正需要的东西。我正试图根据两个文件中的一个公共列合并两个文件

文件1

文件2

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

输出

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 '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
之前最好对文件进行
排序
,但正确的解决方案是:

join <(sort f2) <(sort f1)

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

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
之前最好对文件进行
排序
,但正确的解决方案是:

join <(sort f2) <(sort f1)

您可以使用join命令,如不带awk的join file2 file1。您可以使用join命令,如不带awk的join file2 file1。@VANISHAMITY很好读!记住,如果答案解决了您的问题,您可以接受答案。对于
join
,您不需要显式的
-j1
,这是默认值。这些文件需要排序。@karakfa哦,很好,这个比这个还要短。更新后,许多thanksAs@karakfa指出,
join
如果不先对文件进行排序就无法工作,例如,
join许多人使用
for(i in array)print i
编写awk脚本,当他们以数组索引的数字顺序获得输出时,他们认为一切都很好,当我告诉他们这只是巧合时,有时会对此进行辩论(例如,请参阅下面关于procinfo的评论)。我的观点是,如果您选择不执行手册页告诉您的操作,那么从一个输入集获得您期望的输出并不意味着解决方案将适用于其他输入集、其他工具版本或其他平台。尽管如此,idk;-)。@VanishaMistry阅读起来很好!记住,如果答案解决了您的问题,您可以接受答案。对于
join
,您不需要显式的
-j1
,这是默认值。这些文件需要排序。@karakfa哦,很好,这个比这个还要短。更新后,许多thanksAs@karakfa指出,
join
如果不先对文件进行排序就无法工作,例如,
join许多人使用
for(i in array)print i
编写awk脚本,当他们以数组索引的数字顺序获得输出时,他们认为一切都很好,当我告诉他们这只是巧合时,有时会对此进行辩论(例如,请参阅下面关于procinfo的评论)。我的观点是,如果您选择不执行手册页告诉您的操作,那么从一个输入集获得您期望的输出并不意味着解决方案将适用于其他输入集、其他工具版本或其他平台。尽管如此,idk;-)可能会。