
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.annotations
donde 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.txt
archivo, por lo queread 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) deallKO.txt
, con un espacio al final pero sin una nueva línea final. - Busque (
grep
) elKEGG.annotations
archivo para el ID (quinto campo de la línea deallKO.txt
). Estas serán líneas completas (incluidas las nuevas líneas). - Si
grep
falla, escriba una nueva línea, ya queprintf
no 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”.