UNIX, como comparar e transferir valores entre dois arquivos de texto

2

Eu tenho dois arquivos de texto com diferentes números de colunas e quero comparar os valores de uma determinada coluna no arquivo1.txt com os valores de uma determinada coluna no arquivo2.txt: se esses valores forem encontrados no arquivo2.txt, copie-os um valor correspondente em uma determinada coluna do arquivo2.txt e insira-o em uma nova coluna no arquivo1.txt. Se nenhum valor correspondente encontrado em file2.txt, retorne FALSE para essa linha no arquivo1.txt

Para facilitar o acompanhamento, tenho um exemplo da seguinte forma:

Digamos que eu tenha o arquivo1.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

E 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

Eu quero comparar a coluna Accession (col. 3) do file1.txt com a coluna Accession (col. 1) no file2.txt e se os valores forem encontrados no file2.txt, copie os valores correspondentes na coluna Function ( col. 4) do arquivo2.txt e inserir em uma nova coluna no arquivo1.txt. No final, quero que o arquivo de resultados seja assim (no entanto, não importa a posição da nova coluna de inserção, ela pode estar em qualquer lugar do arquivo):

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

Posso fazer isso com alguns comandos shell ou precisarei de um script?

Agradecemos antecipadamente por sua ajuda.

    
por atd 22.04.2015 / 21:28

1 resposta

1

Com arquivos separados por tabulações:

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
    
por 22.04.2015 / 21:37