Você pode usar um loop de shell:
$ while read pat; do
grep "$pat" file |
while read match do
echo -e "$pat\t$match"
done
done < patterns
KO3435 Xxxxx KO3435;folding factor
KO3435 Yyyyy KO3435,xxxx
KO3322 proteinaseK (KO3322)
Eu testei executando isto no arquivo simples UniProt para humanos (625M) e usando 1000 UniProt IDs como padrões. Demorou ~ 6 minutos no meu laptop Pentium i7. Demorou cerca de 35 segundos quando procurei apenas 100 padrões.
Como apontado nos comentários abaixo, você pode tornar isso um pouco mais rápido ignorando as opções echo
e usando grep
--label
e -H
:
$ while read pat; do
grep "$pat" --label="$pat" -H < file
done < patterns
Executar isso nos seus arquivos de exemplo produz:
$ while read pat; do
grep "$pat" --label="$pat" -H < kegg.annotations;
done < allKO.IDs.txt > test1
terdon@oregano foo $ cat test1
K02217:>aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
K07448:>aai:AARI_33320 mrr; restriction system protein Mrr; K07448 restriction system protein