我有一个问题,它可能是一个愚蠢的问题,但我无法解决它。我知道匹配文件中的列并合并文件非常简单,但不幸的是,即使在尝试了这么多命令之后,我也无法达到我的目标。
我有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'
join
echo
-e
类似)。所以,你必须让 shell 使用以下命令解释该字符ANSI-C 引用 $'...'
。
awk
将要解释特殊字符,因此您可以使用:
awk -F'\t'
但不是
awk -F\t
但是,您可以使用\\t
让 shell 解释\\
,但在我看来引号更具可读性......
对于后一个命令,\t
shell 将被解释为t
(Try: echo \t
)。引用它,这样 shell 就不会解释它。