Corresponder linhas de um arquivo com cabeçalhos em outro para obter inteiro para

3

Eu quero ajuda com scripts para trabalhar com dois arquivos, onde o arquivo 1 lista aminoácidos que estão em ordem específica (um abaixo do outro e também pode repetir) e o segundo arquivo 2 constitui o recurso de características listado em cada aminoácido. Aqui, eu estou tentando combinar o aminoácido da lista um (arquivo 1) para obter seus recursos característicos listados sob o mesmo aminoácido do segundo arquivo (arquivo 2) e copiá-lo para um arquivo de saída na mesma ordem mencionada em arquivo 1.

Por exemplo Arquivo1.txt

    Threonine
    Glutamine
    Alanine
    Asparatate
    Glutamine
    Alanine
    Threonine

Arquivo2.txt

    [ Alanine ] 
    89.1    13.7    -3.12   -10.09
    [ Asparatate ]  
    133.1   30  -2.43   -10.35
    [ Glutamine ]   
    146.1   42.7    -3.46   -10.23
    [ Threonine ]   
    119.1   28.5    -2.43   -9.99   

A saída que estou esperando é a seguinte: output.txt

    [ Threonine ]   
    119.1   28.5    -2.43   -9.99
    [ Glutamine ]   
    146.1   42.7    -3.46   -10.23
    [ Alanine ] 
    89.1    13.7    -3.12   -10.09
    [ Asparatate ]  
    133.1   30  -2.43   -10.35
    [ Glutamine ]   
    146.1   42.7    -3.46   -10.23
    [ Alanine ] 
    89.1    13.7    -3.12   -10.09 
    [ Threonine ]   
    119.1   28.5    -2.43   -9.99

Eu tentei usar o script abaixo no awk, que trabalha com números como índices diferentes de palavras, mas não para esse propósito.

awk 'FNR==NR { a[ "\[ " $1 " \]" ]; next } /^\[/ { f=0 } { for (i in a) if ($0 ~ i) f=1 } f' file1.txt file2.txt > output.txt

Não sei como modificar o script para que ele funcione com as palavras. Por favor, diga-me onde estou indo errado e me ajude a executar o script para obter o resultado desejado.

Eu aprecio muito sua ajuda.

Obrigado antecipadamente.

Asha

    
por Asha 21.04.2015 / 15:05

3 respostas

4

Tudo o que você precisa para percorrer os ácidos em File1.txt e encontrar a linha correspondente em File2.txt + 1 linha, o que é fácil de ser feito por grep

for acid in $(sed 's/^\s*//' File1.txt)
do
    grep -FA1 "$acid" File2.txt
done > Output.txt

Mas se você gostar de awk :

awk '
FNR!=NR{
    print "    [",$1,"]"
    print acids[$1]
    next
}
/\[/{
    acid=$2
    next
}
{
    acids[acid]=$0
}' File2.txt File1.txt > Output.txt
    
por 21.04.2015 / 15:23
2

Uma maneira rápida de fazer isso é usar:

while read amino_acid
do
    grep -A1 ${amino_acid} File2.txt >> output.txt
done < File1.txt
    
por 21.04.2015 / 15:25
2

com xargs / grep :

xargs -n1 -I '{}' grep '{}' -A1 File2.txt <File1.txt

Explicação:

  • -n1 : força xargs a executar o comando para cada linha
  • -I '{}' : defina um placeholer
  • grep '{}' -A1 File2.txt : o comando para executar
    • -A1 : imprime também a linha após o padrão de pesquisa
    • File2.txt : pesquisa por File2.txt
  • <File1.txt : a entrada é File1.txt
por 21.04.2015 / 15:26

Tags