Usando awk
Isso cria uma saída separada por tabulações:
$ 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
Explicação:
-
-v OFS="\t"
Isso torna o separador de campos de saída em uma guia.
-
NR==FNR{a[$1]=$2;next}
Isso cria uma matriz associativa, a
, com base no primeiro arquivo na linha de comando, com a primeira coluna como chave e a segunda coluna como valor. O comando next
instrui awk
a pular o restante dos comandos e pular para a próxima linha.
O arquivo de mapeamento contém algumas linhas de comentário. Poderíamos facilmente ter adicionado uma instrução if
extra para evitar que eles fossem adicionados à matriz a
. No entanto, uma vez que eles não fazem mal, nós pulamos essa complicação.
-
FNR==1{print;next}
Isto imprime a linha de cabeçalho inalterada.
-
{sub(/intron_/, "", $2); sub(/:.*/,"",$2)
Isso remove o fluff do segundo campo deixando apenas a string que queremos.
-
'if ($ 2 in a) $ 2 = a [$ 2]
Se a string do segundo campo estiver presente como uma chave na matriz a
, então substituímos seu valor correspondente.
-
print
A linha revisada é impressa.
Usando bash
No script, substitua
if [ ! -z "$key" ]
Com:
if [[ "$key" && "${map[$key]}" ]]
O que o script parece precisar saber neste momento é se key
estava presente em map
ou não. O teste revisado garante não apenas que key
não está vazio, mas que está em map
.
Com essa alteração, recebo a saída:
$ 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
Como um aparte em text
, [ ! -z "$key" ]
retornará verdadeiro se key
não estiver vazio. Isso é equivalente a [ -n "$key" ]
. Como esse é um teste tão comum, ele pode ser reduzido ainda mais para [ "$key" ]
. Isso pode ser usado para simplificar várias linhas no script bash
.