, я думаю использовать код bash для решения следующей проблемы с моими данными.
Учитывая приведенный ниже набор данных в формате hapmap, в котором мне нужно заменить некоторые символы (в данном случае буквы) на основе данных столбца «аллели». Данные в столбце «аллели» будут сочетанием пар из четырех букв (A, G, C и T).
rs# alleles chro pos ind1 ind2 ind3 ind4 ind5 ind6. .
mar_1 G/T 1 2386806 G T T G K T
mar_2 T/G 1 2386848 T G T K T K
mar_3 G/T 1 2387553 T K G K T G
mar_4 G/A 1 2564608 G G G N R A
mar_5 C/T 1 2564616 C Y C Y T N
.
.
Я хочу получить код, который проходит через всю строку (в случае строки 1), и когда он находит букву «T» (буква после «/»), заменяйте ее буквой «G». (буква перед «/»), и когда он найдет букву «R», «Y», «S», «W», «K» или «M», замените ее на «T» (буква после «/ ").
Другими словами, код должен найти (в каждой строке) все буквы, соответствующие букве после «/» (в столбце «аллели»), и заменить их буквой, совпадающей с буквой перед "/". И, когда он находит букву, которая соответствует одному из этих: («R», «Y», «S», «W», «K» или «M»), он должен заменить ее буквой, которая соответствует с единицей после "/".
Я хотел бы получить следующие выходные данные:
rs# alleles chro pos ind1 ind2 ind3 ind4 ind5 ind6. .
mar_1 G/T 1 2386806 G G G G T G
mar_2 T/G 1 2386848 T T T G T G
mar_3 G/T 1 2387553 G T G T G G
mar_4 G/A 1 2564608 G G G N A G
mar_5 C/T 1 2564616 C T C T C N
.
.
Примечание: «N» означает отсутствующее значение, поэтому оно должно быть сохранено таким, как есть.
Мы будем очень благодарны за любую помощь в этом вопросе.
С perl
$ perl -F'\s+|/' -lape '
s/^(\S+\s+){4}\K.*/$&=~s|$F[2]|$F[1]|gr/e;
s/^(\S+\s+){4}\K.*/$&=~s|[RYSWKM]|$F[2]|gr/e
' ip.txt
rs# alleles chro pos ind1 ind2 ind3 ind4 ind5 ind6. .
mar_1 G/T 1 2386806 G G G G T G
mar_2 T/G 1 2386848 T T T G T G
mar_3 G/T 1 2387553 G T G T G G
mar_4 G/A 1 2564608 G G G N A G
mar_5 C/T 1 2564616 C T C T C N
-F '\ s + | /'
разделить строку ввода на пробелы или символ /
, сохраненный в ] @F
массив ^ (\ S + \ s +) {4} \ K. *
получит все столбцы, кроме первых четырех $ & = ~ s | $ F [2] | $ F [1]
в совпавшей части (столбцы, кроме первых четырех) выполнить другую замену
$ F [2]
будет содержать символ после /
и $ F [1]
будет содержать символ перед /
Модификатор] r
возвращает последнюю заменяемую строку, а модификатор e
позволяет использовать код Perl в разделе замены s // $ & = ~ s | [RYSWKM] | $ F [2] | gr / e
-lape
параметров perl -F'/(\s+|\/)/' -lne '
print @F[0..9], map { s/($F[4])|([RYSWKM])/$2?$F[4]:$F[2]/re } @F[10..$#F];
' hapmap.txt
sed -e '
s/^\(\S\+\s\+\)\{4\}/&\n/ # mark col-4
:a
s|^\(\S\+\s\+\(.\)/\(.\).*\n.*\)\3|\1\2|g;ta # perform sub-1
:b
s|^\(\S\+\s\+\(.\)/\(.\).*\n.*\)[RYSWKM]|\1\3|g;tb # perform sub-2
s/\n//g # throw away marker
' hap_map.txt