Linuxでは、2つのファイルの最初の列を一致させ、File2の最後の列をFile1にマージします。

Linuxでは、2つのファイルの最初の列を一致させ、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つの列があります。

ファイル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実際には保持されます(タブと同じではありません)。\tvsと非常に似ています(アナログがないかのように動作しますecho '\t'echo -e '\t'joinecho-e)。したがって、シェルに次の文字を使用して文字を解釈する必要があります。ANSI-Cの引用 $'...'


awk 〜する特殊文字を解釈するので、次のものを使用できます。

awk -F'\t'

しかし、

awk -F\t

\\tしかし、 let the shellinterpret を使用することはできますが、\\私の考えでは引用符が読みやすくなります。

後者のコマンドでは、シェルは(Try:)\tとして解釈されます。シェルが解釈されないように引用します。techo \t

関連情報