Procura por padrão e anexa linha a outro arquivo

1

Eu tenho um arquivo como este (cinco colunas separadas por tabulações)

head allKO.txt
Metabolism Carbohydrate metabolism Glycolisis K07448
Metabolism Protein metabolism protesome K02217

e quero procurar o padrão (string) na coluna 5 no arquivo KEGG.annotations e, se for encontrado, quero imprimir em outro arquivo a linha de KEGG.annotations em que o padrão foi encontrado e todas as colunas de allKO.txt . O arquivo em que estou procurando o padrão é:

head KEGG.annotations
>aai:AARI_24510  proP; proline/betaine transporter; K03762 MFS transporter, MHS family, proline/betaine transporter
>aai:AARI_26600  ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
>aai:AARI_28260  hypothetical protein
>aai:AARI_29060  ABC drug resistance transporter, inner membrane subunit; K09686 antibiotic transport system permease protein
>aai:AARI_29070  ABC drug resistance transporter, ATP-binding subunit (EC:3.6.3.-); K09687 antibiotic transport system ATP-binding protein
>aai:AARI_29650  hypothetical protein
>aai:AARI_32480  iron-siderophore ABC transporter ATP-binding subunit (EC:3.6.3.-); K02013 iron complex transport system ATP-binding protein [EC:3.6.3.34]
>aai:AARI_33320  mrr; restriction system protein Mrr; K07448 restriction system protein

Eu quero algo assim:

Metabolism Carbohydrate metabolism Glycolisis K07448 >aai:AARI_33320 mrr; restriction system protein Mrr; K07448 restriction system
Metabolism Protein metabolism proteasome K02217  >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]

Observe que o texto >aai:AARI_33320 mrr; restriction … que é anexado à primeira linha é a oitava linha de KEGG.annotations , que é o que contém K07448 (que é o campo ID (quinto campo) da primeira linha de allKO.txt ).

Como posso modificar este código para usar meu arquivo padrão? Isso funciona com um arquivo padrão com apenas uma coluna contendo o padrão específico a ser encontrado.

while read pat; do
    grep "$pat" --label="$pat" -H < KEGG.annotations;
done < allKO.txt > test1
    
por Francesca de Filippis 17.11.2014 / 19:08

2 respostas

0

Você poderia trabalhar com o código que você já tem. Armazene a linha em uma matriz e corresponda ao quinto elemento:

while read -r line; do
    [ -z "$line" ] && continue
    patlist=($line)
    pat=${patlist[4]}
    grep "$pat" --label="$line" -H < KEGG.annotations
done < allKO.txt

retorna:

Metabolism Carbohydrate metabolism Glycolisis K07448:>aai:AARI_33320  mrr; restriction system protein Mrr; K07448 restriction system protein
Metabolism Protein metabolism protesome K02217:>aai:AARI_26600  ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
    
por 18.11.2014 / 05:50
0

Isso parece fazer o que você parece estar pedindo:

while read w1 w2 w3 w4 ID
do
    printf "%s " "$w1 $w2 $w3 $w4 $ID"
    if ! grep "$ID" KEGG.annotations
    then
        echo
    fi
done < allKO.txt

Isso gravará a saída na tela. Adicione um redirecionamento de saída ( > ) (por exemplo, > test1 ) à última linha para capturar a saída em um arquivo.

  • Com base nos seus exemplos, o campo de chave / ID ("padrão") é o quinto de cinco campos no arquivo allKO.txt , então nós read w1 w2 w3 w4 ID . Você diz que este é um arquivo delimitado por tabulações; Estou assumindo que nenhum dos campos contém espaços.
  • Escreva ( printf ) a linha (ou seja, os campos) de allKO.txt , com um espaço no final, mas sem nova linha de terminação.
  • Pesquise ( grep ) o arquivo KEGG.annotations da ID (quinto campo da linha de allKO.txt ). Estas serão linhas completas (incluindo novas linhas).
  • Se o grep falhar, escreva uma nova linha, já que printf não.
  • Isso resultará em linhas cujo ID não está presente em KEGG.annotations para ser simplesmente escrito para a saída:

    Metabolism Protein metabolism proteasome K02217  >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
    This ID doesn’t exist: K99999
    

    e IDs que existem mais de uma vez são gravados como linhas adicionais (não repetindo os dados de allKO.txt ):

    Metabolism Protein metabolism proteasome K02217  >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
    This is a hypothetical additional line from KEGG.annotations that mentions “K02217”.
    
por 18.11.2014 / 02:14