Строки замены в файле с другой соответствующей строкой из другого файла

У меня есть a file1 в котором 2-й последний столбец является кодом для первого столбца, например, Rv0002 имеет два кода S и 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

Существует другой file2 который имеет весь уникальный Rv* в первом столбце:

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

Я хотел бы иметь третий файл output который совпадает с file2 кроме каждого Rv* заменяется его кодом (кодами). Например, в вышеупомянутом примере, output будет похож:

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

Это - завершения, которые я имею, но это не работает.

#!/bin/bash
while read p; do

  gene=$( awk '{print $1}' )
  grep "$gene" $2 | 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 < $1

Мои файлы имеют приблизительно десять тысяч строк, если это имеет значение.

1
задан 3 June 2017 в 11:47

1 ответ

В первую очередь, Ваш file1 не имеет никакого определенного разделителя, второго, у Вас есть те же ключи с различными значениями как "Rv0002 S" и "Rv0002 L".

, Поскольку Ваш желаемый вывод показывает, я полагаю, что все строки отсортированы, и Вы просто хотите присоединиться к этим двум файл вместе.

Вот то, что я сделал бы:

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

Это создаст список ключей для меня как:

$ cat list1
Rv0001  T       
Rv0002  S       
Rv0002  L  

, В конце концов, я присоединюсь к ним и сокращу мои желаемые поля:

$ 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
3
ответ дан 7 December 2019 в 12:33

Другие вопросы по тегам:

Похожие вопросы: