Grep para buscar patrones en un archivo

Grep para buscar patrones en un archivo

Quiero usarlo greppara buscar patrones de un archivo en otro. Mi archivo de patrón es algo como:

K02217
K07448
KO8980

El archivo a buscar es:

>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

El comando que probé es:

fgrep --file=pattern.txt file.txt >> output.txt

Esto imprime las líneas del archivo.txt donde se encuentra el patrón. Lo necesito para imprimir también una columna con el patrón encontrado. Entonces algo como:

K07448 mrr; restriction system protein Mrr; K07448 restriction system
K02217 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]

¿Alguien puede sugerirme cómo hacerlo?

Respuesta1

Si no le importa una columna adicional con un número, puede usar joiny greppara hacer esto.

$ join <(grep -of patterns.txt file.txt | nl) \
       <(grep -f patterns.txt file.txt | nl)
1 KO3322 proteinaseK (KO3322)
2 KO3435 Xxxxx KO3435;folding factor
3 KO3435 Yyyyy KO3435,xxxx

Respuesta2

Puedes usar un bucle 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)

Lo probé ejecutando esto en el archivo plano UniProt para humanos (625M) y usando 1000 ID de UniProt como patrones. Me tomó ~6 minutos en mi computadora portátil Pentium i7. Me tomó ~35 segundos cuando solo busqué 100 patrones.


Como se señala en los comentarios a continuación, puede hacer esto un poco más rápido omitiendo echoy usando greplas opciones --labely -H:

$ while read pat; do 
    grep "$pat" --label="$pat" -H < file
done < patterns

Ejecutar esto en sus archivos de ejemplo produce:

$ 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

Respuesta3

Puedes usarack:

$ ack "$(tr '\n' '|' < pattern.txt | sed -e 's/.$//')" --print0 --output='$& $_' file.txt
KO3322 proteinaseK (KO3322)
KO3435 Xxxxx KO3435;folding factor
KO3435 Yyyyy KO3435,xxxx

información relacionada