我有两个文本文件,其中的列数不同,我想比较 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