Busque un patrón y agregue una línea a otro archivo

Busque un patrón y agregue una línea a otro archivo

Tengo un archivo como este (cinco columnas separadas por tabulaciones)

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

y quiero buscar el patrón (cadena) en la columna 5 del archivo KEGG.annotations, y, si lo encuentra, quiero imprimir en otro archivo tanto la línea de KEGG.annotationsdonde se encontró el patrón como todas las columnas de allKO.txt. El archivo donde busco el patrón es:

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

Quiero algo como esto:

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]

Tenga en cuenta que el >aai:AARI_33320 mrr; restriction …texto que se agrega a la primera línea es la octava línea de KEGG.annotations, que es la que contiene K07448(que es el campo ID (quinto campo) de la primera línea de allKO.txt).

¿Cómo puedo modificar este código para utilizar mi archivo de patrón? Esto funciona con un archivo de patrón con una sola columna que contiene el patrón específico a buscar.

while read pat; do
    grep "$pat" --label="$pat" -H < KEGG.annotations;
done < allKO.txt > test1

Respuesta1

Podrías trabajar con el código que ya tienes. Guarde la línea en una matriz y haga coincidir el 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

devoluciones:

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]

Respuesta2

Esto parece hacer lo que parece estar pidiendo:

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

Esto escribirá la salida en la pantalla. Agregue una >redirección de salida ( ) (por ejemplo, > test1) a la última línea para capturar la salida en un archivo.

  • Según sus ejemplos, el campo clave/ID ("patrón") es elquintodecincocampos en el allKO.txtarchivo, por lo que read w1 w2 w3 w4 ID. Dice que este es un archivo delimitado por tabulaciones; Supongo que ninguno de los campos contiene espacios.
  • Escriba ( printf) la línea (es decir, los campos) de allKO.txt, con un espacio al final pero sin una nueva línea final.
  • Busque ( grep) el KEGG.annotationsarchivo para el ID (quinto campo de la línea de allKO.txt). Estas serán líneas completas (incluidas las nuevas líneas).
  • Si grepfalla, escriba una nueva línea, ya que printfno lo hizo.
  • Esto dará como resultado que las líneas cuyo ID no esté presente KEGG.annotations se escriban simplemente en la salida:

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

    y los ID que existen más de una vez se escriben como líneas adicionales (sin repetir los datos 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”.
    

información relacionada