
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 do arquivo KEGG.annotations
, e, se for encontrado, quero imprimir em outro arquivo tanto a linha de KEGG.annotations
onde o padrão foi encontrado quanto todas as colunas do allKO.txt
. O arquivo onde procuro 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 >aai:AARI_33320 mrr; restriction …
texto 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 de 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
Responder1
Você poderia trabalhar com o código que já possui. Armazene a linha em um array e combine o 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]
Responder2
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 em seus exemplos, o campo chave/ID (“padrão”) é oquintodecincocampos no
allKO.txt
arquivo, então nósread w1 w2 w3 w4 ID
. Você diz que este é um arquivo delimitado por tabulações; Presumo que nenhum dos campos contenha espaços. - Escreva (
printf
) a linha (ou seja, os campos) deallKO.txt
, com um espaço no final, mas sem nova linha final. - Pesquise (
grep
) oKEGG.annotations
arquivo pelo ID (quinto campo da linha deallKO.txt
). Estas serão linhas completas (incluindo novas linhas). - Se
grep
falhar, escreva uma nova linha, já queprintf
não. Isso fará com que as linhas cujo ID não esteja presente
KEGG.annotations
sejam simplesmente gravadas na 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 escritos como linhas adicionais (sem repetir 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”.