2

У меня есть два текстовых файла с различным количеством столбцов в них, и я хочу сравнить значения данного столбца в file1.txt со значениями данного столбца в file2.txt: если эти значения найдены в file2.txt, то скопируйте соответствующее значение в определенном столбце из file2.txt и вставьте его в новый столбец в file1.txt. Если соответствующее значение не найдено в file2.txt, вернуть FALSE для этой строки в file1.txt

Чтобы было легче следовать, у меня есть следующий пример:

Скажи, у меня есть 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

Я хочу сравнить столбец Accession (столбец 3) файла file1.txt со столбцом Accession (столбец 1) в файле file2.txt и, если значения находятся в file2.txt, скопировать соответствующие значения в столбец Function (столбец 4). ) файла 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

Могу ли я сделать это с помощью некоторых команд оболочки или мне понадобится скрипт?

Заранее спасибо за помощь.

1 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .