Substituir strings em um arquivo por outra string correspondente de outro arquivo

1

Eu tenho um file1 no qual a segunda última coluna é um código para a primeira coluna, por exemplo, Rv0002 tem dois códigos S e L :

Rv0001 -       hypothetical protein Rv0019c    T       Signal_transduction_mechanisms
Rv0002  -       hypothetical protein Rv0030     S       Function_unknown
Rv0002 pknA    TRANSMEMBRANE SERINE (STPK A)        L       recombination_and_repair

Existe outro file2 que tem todos os Rv * únicos na primeira coluna:

Rv0001  -0.581372258    -0.147459774    0.548735372 1.001137114
Rv0002  -1.555384307    0.386044242 0.046125098 -0.06681665

Eu gostaria de ter um terceiro arquivo output , que é o mesmo que file2 , exceto que cada Rv * é substituído por seu (s) código (s). Por exemplo, no exemplo acima, output será semelhante a:

T   -0.581372258    -0.147459774    0.548735372 1.001137114
S   -1.555384307    0.386044242 0.046125098 -0.06681665
L   -1.555384307    0.386044242 0.046125098 -0.06681665

Este é o fechamento que eu tenho, mas não está funcionando.

#!/bin/bash
while read p; do

  gene=$( awk '{print }' )
  grep "$gene"  | while read -r line ; do
    function_code=$( awk '{print $(NF-1)}' )
    new_row=$(echo $line | sed -e 's/$gen/$function_code/g' )
    echo $new_row >> output
  done

done < 

Meus arquivos têm cerca de dez mil linhas, se isso importa.

    
por havij 02.06.2017 / 22:37

1 resposta

3

Em primeiro lugar, o seu file1 não tem nenhum delimitador específico, depois você tem as mesmas chaves com valores diferentes, como "Rv0002 S" e "Rv0002 L" .

Como sua saída desejada mostra, considero que todas as linhas estão classificadas e você só quer juntar esses dois arquivos juntos.

Aqui está o que eu faria:

sed -r "s/(^Rv[0-9]+\s).*(\s+[A-Z]\s+).*//" file1 > list1

Ele criará uma lista de chaves para mim como:

$ cat list1
Rv0001  T       
Rv0002  S       
Rv0002  L  

Afinal, eu vou me juntar a eles e cortar meus campos desejados:

$ join list1 file2 | cut -f2- -d' '
T  -0.581372258 -0.147459774 0.548735372 1.001137114
S  -1.555384307 0.386044242 0.046125098 -0.06681665
L  -1.555384307 0.386044242 0.046125098 -0.06681665
    
por Ravexina 02.06.2017 / 23:15