
El archivo de entrada que debe editarse es el siguiente (puede tener más filas):
bundle_id target_id length eff_length tot_counts uniq_counts est_counts eff_counts ambig_distr_alpha ambig_distr_beta fpkm fpkm_conf_low fpkm_conf_high solvable tpm
1 intron_FBgn0035847:4_FBgn0035847:3 61 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
2 intron_FBgn0032515:2_FBgn0032515:4 72 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
3 intron_FBgn0266486:5_FBgn0266486:4 58 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
4 intron_FBgn0031359:10_FBgn0031359:7 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
4 intron_FBgn0031359:10_FBgn0031359:8 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
4 intron_FBgn0031359:10_FBgn0031359:9 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
536 intron_CR31143:1_CR31143:2 40 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
Para cada ID en la segunda columnaintrón_XXXXXXXX:X_XXXXXXXXX:X, quiero extraer la cadena entreintrón_y el 1er:(entre la cadena generalmente, pero no siempre, comienza con FBgn).
Entonces tengo una lista como la siguiente (una columna paraFBgny la otra columna para el nombre correspondiente al que quiero convertir el FBgn):
## FlyBase Gene Mapping Table
## Generated: Fri Dec 20 12:37:29 2013
## Using datasource: dbi:Pg:dbname=fb_2014_01_reporting;host=flysql9;port=5432...
FBgn0035847 mthl7
FBgn0032515 loqs
FBgn0266486 CG45085
FBgn0031359 CG18317
Luego quiero buscar la cadena extraída en la primera columna de la lista.
Si la cadena extraída tiene el valor correspondiente en la segunda columna, quiero reemplazar el ID completointron_FBgnXXXXXX:X_FBgnXXXXXX:Xcon el nombre correspondiente en la 2ª columna.
Si la cadena extraída no existe en la primera columna, quiero reemplazar el ID completointrón_XXXXXXXX:X_XXXXXXXXX:Xcon la cuerda extraída.
Tengo un script como el siguiente:
ref="gene_map_table_fb_2014_01_short.tsv"
target="HC25_LNv_ZT02_intron_results.txt"
output="temptemp.txt"
declare -A map
while read line
do
if [[ ! -z "$line" ]] && [[ ! "$line" =~ ^#.* ]]
then
key=$(echo "$line" | cut -f 1)
value=$(echo "$line" | cut -f 2)
map[$key]=$value
fi
done < $ref
while read line
do
key=$(echo "$line" | sed -n 's/.*_\([^\.]*\)\:.*/\1/p' | head -1)
if [ ! -z "$key" ]
then
echo "$line" | sed 's/intron_[^[:space:]]*/'${map[$key]}'/g' >> $output
else
echo "$line" | sed 's/intron_[^[:space:]]*/'$key'/g' >> $output
fi
done < $target
Todo parece funcionar bien excepto que el archivo de salida carece de líneas cuyo ID no comienza con FBgn.
Respuesta1
Puedes hacerlo:
cat gene_map_table_fb_2014_01_short.tsv |sed '1d' |awk {'print $2'} |awk 'BEGIN{FS=":"} {print $2}' |sed s/._//g
Al principio, busque su archivo, luego elimine la primera línea (encabezado de las columnas con d1), luego imprima toda la columna, luego separe 4_FBgn0035847
con awk 'BEGIN{FS=":"} {print $2}'
Luego elimine number_
consed s/._//g
La salida es:
FBgn0035847
FBgn0032515
FBgn0266486
1FBgn0031359
1FBgn0031359
1FBgn0031359
CR31143
Sin embargo, si su línea final es adicional y desea eliminarla, puede hacerlo:
cat gene_map_table_fb_2014_01_short.tsv |sed '1d' |awk {'print $2'} |awk 'BEGIN{FS=":"} {print $2}' |sed s/._//g |sed '$d'
Entonces, la salida es:
FBgn0035847
FBgn0032515
FBgn0266486
1FBgn0031359
1FBgn0031359
1FBgn0031359
Respuesta2
Usandoawk
Esto crea una salida separada por tabulaciones:
$ awk -v OFS="\t" 'NR==FNR{a[$1]=$2;next} FNR==1{print;next} {sub(/intron_/, "", $2); sub(/:.*/,"",$2);if ($2 in a) $2=a[$2];print}' gene_map_table_fb_2014_01_short.tsv HC25_LNv_ZT02_intron_results.txt
bundle_id target_id length eff_length tot_counts uniq_counts est_counts eff_counts ambig_distr_alpha ambig_distr_beta fpkm fpkm_conf_low fpkm_conf_high solvable tpm
1 mthl7 61 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
2 loqs 72 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
3 CG45085 58 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
4 CG18317 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
4 CG18317 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
4 CG18317 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
536 CR31143 40 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
Explicación:
-v OFS="\t"
Esto convierte el separador de campo de salida en una pestaña.
NR==FNR{a[$1]=$2;next}
Esto crea una matriz asociativa,
a
basada en el primer archivo de la línea de comando, con la primera columna como clave y la segunda columna como valor. Elnext
comando indicaawk
que se omita el resto de los comandos y pase a la siguiente línea.El archivo de mapeo contiene algunas líneas de comentarios. Podríamos haber agregado fácilmente una
if
declaración adicional para evitar que se agreguen a la matriza
. Sin embargo, como no causan daño, nos saltamos esa complicación.FNR==1{print;next}
Esto imprime la línea del encabezado sin cambios.
{sub(/intron_/, "", $2); sub(/:.*/,"",$2)
Esto elimina la pelusa del segundo campo dejando solo la cadena que queremos.
`si ($2 en a) $2=a[$2]
Si la cadena del segundo campo está presente como clave en una matriz
a
, entonces sustituimos su valor correspondiente.print
Se imprime la línea revisada.
Usandobash
En el script, reemplace
if [ ! -z "$key" ]
Con:
if [[ "$key" && "${map[$key]}" ]]
Lo que el guión parece necesitar saber en este momento es si key
estuvo presente map
o no. La prueba revisada garantiza no sólo que key
no esté vacío sino que esté en formato map
.
Con ese cambio, obtengo el resultado:
$ cat temptemp.txt
bundle_id target_id length eff_length tot_counts uniq_counts est_counts eff_counts ambig_distr_alpha ambig_distr_beta fpkm fpkm_conf_low fpkm_conf_high solvable tpm
1 mthl7 61 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
2 loqs 72 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
3 CG45085 58 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
4 CG18317 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
4 CG18317 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
4 CG18317 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
536 CR31143 40 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
Además text
, [ ! -z "$key" ]
devuelve verdadero si key
no está vacío. Esto equivale a [ -n "$key" ]
. Dado que se trata de una prueba tan común, se puede acortar aún más a [ "$key" ]
. Esto podría usarse para simplificar varias líneas del bash
script.