Substituição de várias palavras no arquivo delimitado por tabulações com palavras alternativas

1

Eu tenho um arquivo delimitado por tabulações com códigos (por exemplo, ctc, nmg, nml) que indicam organismos (File_1):

522 ctc:CTC00972    -   506 3.20E-138   
522 nmg:Nmag_3027   -   561 4.70E-73
522 nml:Namu_3564   -   566 1.80E-146

Eu também tenho um arquivo delimitado por tabulação que vincula os códigos aos nomes dos organismos (Arquivo_2):

ctc  Clostridium_tetani_E88
nla  Neisseria_lactamica
nmg  Natrialba_magadii

Como posso substituir os códigos em File_1 pelos nomes dos organismos em File_2?

Saída desejada:

522 Clostridium_tetani_E88:CTC00972 -   506 3.20E-138   
522 Natrialba_magadii:Nmag_3027     -   561 4.70E-73
522 Neisseria_lactamica:Namu_3564   -   566 1.80E-146

Tenha em mente que existem milhares desses códigos no conjunto de dados completo e que a ordem dos organismos não é a mesma no Arquivo_1 e no Arquivo_2.

    
por P.tin 16.05.2017 / 14:35

3 respostas

1

É realmente apenas uma variante do "compilar uma tabela de pesquisa a partir de um arquivo; usá-lo ao processar o outro arquivo", com o enrugamento que a chave de pesquisa precisa ser dividida do segundo campo. Você poderia fazer isso em awk , por exemplo:

awk '
  BEGIN{OFS=FS="\t"} 
  NR==FNR {
    a[$1]=$2; next
  } 
  {
    split($2,b,":"); 
    if (b[1] in a) $2 = a[b[1]]":"b[2]
  } 1' File_2 File_1
    
por 16.05.2017 / 14:52
0

Isso deve fazer o trabalho com sed :

sed '/^[a-z]*[[:cntrl:]].*/{s/[[:cntrl:]]/###/;H;d;}
 G
 s/\([a-z]*\)\(:.*\n\)###\([^[:cntrl:]]*\)//
 P
 d' file_2 file_1

É uma adoção de solução genérica . Veja lá para uma explicação de como funciona.

    
por 16.05.2017 / 14:52
0

awk abordagem:

awk 'NR==FNR{a[$1]=$2;next}$2 in a{$2=a[$2]":"$3;$3=""}1' File_2 FS="[ |:]" File_1

A saída:

522 Clostridium_tetani_E88:CTC00972     -   506 3.20E-138   
522 Natrialba_magadii:Nmag_3027    -   561 4.70E-73
522 nml:Namu_3564   -   566 1.80E-146

Observe que os códigos nml e nla não têm correspondências entre os dois arquivos de entrada

    
por 16.05.2017 / 16:11