UNIX,如何比较和传输两个文本文件之间的值

UNIX,如何比较和传输两个文本文件之间的值

我有两个文本文件,其中的列数不同,我想比较 file1.txt 中给定列的值与 file2.txt 中给定列的值:如果在 file2.txt 中找到这些值,则从 file2.txt 中的特定列复制相应的值并将其插入到 file1.txt 中的新列中。如果在 file2.txt 中未找到相应的值,则对 file1.txt 中的该行返回 FALSE。

为了更容易理解,我有一个例子如下:

假设我有 file1.txt

Query       No.     Accession   Name    DB
EFX03602.1  1006    PHI:1006    HMR1    Not_Available
EFX00827.1  101     PHI:101     ALB1    AAC39471
EFX01509.1  101     PHI:101     ALB1    AAC39471
EFX05810.1  1010    PHI:1010    SID1    XM_385547
EFX00466.1  1026    PHI:1026    bcplc1  AAB39564

和file2.txt

Accession   DB_Type     DB_Accession    Function
PHI:1006    Uniprot     I1RXX1          HMG-CoA Reductase
PHI:101     Entrez      AAC39471        Polyketide synthase
PHI:7       Entrez      CAA42824        Effector protein
PHI:1026    Entrez      AAB39564        Phospholipase C
PHI:1028    Entrez      CAC29255        pectin methylesterase
PHI:1030    Entrez      CAA93142        ABC Transporter
PHI:17      Entrez      CAA43678        Acid proteinase

我想比较 file1.txt 中的 Accession 列(第 3 列)和 file2.txt 中的 Accession 列(第 1 列),如果在 file2.txt 中找到这些值,则复制 file2.txt 中的 Function 列(第 4 列)中的相应值,并将其插入到 file1.txt 中的新列中。最后,我希望结果文件看起来像这样(不过,新插入列的位置无关紧要,它可以位于文件中的任何位置):

Query       No.     Accession   Function            Name    DB
EFX03602.1  1006    PHI:1006    HMG-CoA Reductase   HMR1    Not_Available
EFX00827.1  101     PHI:101     Polyketide synthase ALB1    AAC39471
EFX01509.1  101     PHI:101     Polyketide synthase ALB1    AAC39471
EFX05810.1  1010    PHI:1010    FALSE               SID1    XM_385547
EFX00466.1  1026    PHI:1026    Phospholipase C     bcplc1  AAB39564

我可以使用一些 shell 命令来执行此操作吗?或者我需要一个脚本?

在此先感谢您的帮助。

答案1

使用制表符分隔的文件:

awk '
    BEGIN { FS = OFS = "\t" }
    NR == FNR {fn[$1] = $4; next} 
    {print $1, $2, $3, ($3 in fn ? fn[$3] : "FALSE"), $4, $5}
' file2.txt file1.txt 
Query   No. Accession   Function    Name    DB
EFX03602.1  1006    PHI:1006    HMG-CoA Reductase   HMR1    Not_Available
EFX00827.1  101 PHI:101 Polyketide synthase ALB1    AAC39471
EFX01509.1  101 PHI:101 Polyketide synthase ALB1    AAC39471
EFX05810.1  1010    PHI:1010    FALSE   SID1    XM_385547
EFX00466.1  1026    PHI:1026    Phospholipase C bcplc1  AAB39564

相关内容