У меня есть 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
Мои файлы имеют приблизительно десять тысяч строк, если это имеет значение.
В первую очередь, Ваш 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