在linux中匹配两个文件的第一列并将File2的最后一列合并到File1中

在linux中匹配两个文件的第一列并将File2的最后一列合并到File1中

我有一个问题,它可能是一个愚蠢的问题,但我无法解决它。我知道匹配文件中的列并合并文件非常简单,但不幸的是,即使在尝试了这么多命令之后,我也无法达到我的目标。

我有2个文件

文件1:

BP2808  1.83684448966078    10.7449438228544    27.7057862093578    1.4123961881793E-07 4.26390957350344E-06
BP1319  2.75272032616902    8.74039675296892    27.5666097653874    1.51776372331745E-07    4.46142652354102E-06
dps 1.47015471230894    10.7061416142689    27.1494663323484    1.88317176247083E-07    5.39359707353824E-06
fusA    -1.38504972563843   11.8361844791496    27.0016273796008    2.03284239943838E-07    5.67671240043168E-06
BP1320  2.67552497792458    8.77604324182685    26.5184193030292    2.61037278592442E-07    7.11167415092092E-06

第二个文件有 2 列

文件2:

BP2808  hypothetical protein
BP1319  Memebrane protein
dps     DNA-binding protein
fusA    elongation factor G 

期望的输出:

BP2808  1.83684448966078    10.7449438228544    27.7057862093578    1.4123961881793E-07 4.26390957350344E-06    hypothetical protein
BP1319  2.75272032616902    8.74039675296892    27.5666097653874    1.51776372331745E-07    4.46142652354102E-06     Memebrane protein
dps 1.47015471230894    10.7061416142689    27.1494663323484    1.88317176247083E-07    5.39359707353824E-06     DNA-binding protein
fusA    -1.38504972563843   11.8361844791496    27.0016273796008    2.03284239943838E-07    5.67671240043168E-06    elongation factor G
BP1320  2.67552497792458    8.77604324182685    26.5184193030292    2.61037278592442E-07    7.11167415092092E-06    NA

我试过awk,粘贴。加入但没有得到所需的输出,我猜这是因为文件 3 最后一列中的字符串之间存在空格,如果我没记错的话。

paste File1 File2 | awk '{$2=""; print}' > Testing

awk -F\t '{getline f1 <"File1" ;print f1,$2}' OFS=, File2 > Testing

join -t'\t' <(sort File1) <(sort File2) > Testing

在互联网上进行大量搜索后还有更多。如果有人可以帮助我,那会节省我很多时间。

答案1

使用

join -t $'\t'

join不解释退格转义的特殊字符。\t实际上会留下来(这不等于制表符),与vs\t非常相似(行为就像没有echo '\t'echo -e '\t'joinecho-e类似)。所以,你必须让 shell 使用以下命令解释该字符ANSI-C 引用 $'...'


awk 将要解释特殊字符,因此您可以使用:

awk -F'\t'

但不是

awk -F\t

但是,您可以使用\\t让 shell 解释\\,但在我看来引号更具可读性......

对于后一个命令,\tshell 将被解释为t(Try: echo \t)。引用它,这样 shell 就不会解释它。

相关内容