GOOGLE ADS

domingo, 1 de mayo de 2022

¿Busca dentro de cadenas en un solo campo que contiene un delimitador en el campo en dos archivos usando awk?

tengo dos archivos

file01.tab:

Q86IC9 PGEN_.00g000010
P04177 PGEN_.00g000020
Q8L840 PGEN_.00g000050
Q61043 PGEN_.00g000060
A1E2V0 PGEN_.00g000080
P34456 PGEN_.00g000090
P34457 PGEN_.00g000120
O00463 PGEN_.00g000210
Q00945 PGEN_.00g000230
Q5SWK7 PGEN_.00g000240

file02.tab:

Q86IC9;Q552T5   omt5
P04177 Th
Q8L840;O04092;Q9FT71 RECQL4A
Q61043;A0A1Y7VJL5;B2RQ73;B7ZMZ9;E9Q488;E9Q4S3;Q674R4;Q6ZPM7 Nin
A1E2V0 BIRC3
P34456 Uncharacterized
P34457 uncharacterized
O00463;B4DIS9;B4E0A2;Q6FHY1 TRAF5
Q00945 RING
Q5SWK7;Q8BXX5;Q9CXG1 Rnf145

Quiero usar la primera columna file01.tabpara unirme a la primera columna de file02.tab. Podría hacer esto con grep, pero necesito que la salida esté formateada de la siguiente manera:

PGEN_.00g000010 Q86IC9;Q552T5 omt5
PGEN_.00g000020 P04177 Th
QPGEN_.00g000050 Q8L840;O04092;Q9FT71 RECQL4A

Estuve muy cerca del éxito usando el siguiente awkcódigo:

awk 'NR==FNR{a[$1]=$0; next} ($1 in a){print $2,a[$1]}' file02.tab file01.tab

Ese one-liner producirá lo siguiente:

PGEN_.00g000020 P04177 Th
PGEN_.00g000080 A1E2V0 BIRC3
PGEN_.00g000090 P34456 Uncharacterized
PGEN_.00g000120 P34457 uncharacterized
PGEN_.00g000230 Q00945 RING
PGEN_.00g000280 Q8ZXT3 protein
PGEN_.00g000300 Q5REG4 DTX3
PGEN_.00g000450 A0JMR6 mysm1
PGEN_.00g000490 Q7D513 Hercynine
PGEN_.00g000530 A6H769 RPS7

El código no encuentra coincidencias file02.tab $1donde hay un delimitador de punto y coma en el campo. Solo encontrará coincidencias que tengan una sola entrada en $1.

Obviamente, greppuedo manejar la búsqueda usando dos archivos de entrada, pero no sé cómo formatear la salida de los grepresultados, ya que el formato requiere información de ambos archivos de entrada.

¿Hay alguna manera de lograr esto con una awksola línea o debo armar un pequeño guión en su lugar?


Solución del problema

puedes probar con split inawk

awk 'NR==FNR{
n=split($1,s,";");
for(i=1;i<=n;++i) a[s[i]]=$0;
next;
} ($1 in a){print $2,a[$1];}
' file02.tab file01.tab

usted obtiene,

PGEN_.00g000010 Q86IC9; Q552T5 omt5 
PGEN_.00g000020 P04177 Th
PGEN_.00g000050 Q8L840; O04092; Q9FT71 RECQL4A
PGEN_.00g000060 Q61043; A0A1Y7VJL5; B2RQ73; B7ZMZ9; E9Q488; E9Q4S3; Q674R4; Q6ZPM7 Nin
PGEN_.00g000080 A1E2V0 BIRC3
PGEN_.00g000090 P34456 no caracterizado
PGEN_.00g000120 P34457 no caracterizado
PGEN_.00g000210 O00463;B4DIS9;B4E0A2;Q6FHY1 TRAF5
PGEN_.00g000230 Q00945 ANILLO
PGEN_.00g000240 Q5SWK7;Q8BXX5;Q9CXG1 Rnf145

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...