Заменить символы в наборе данных hapmap

, я думаю использовать код 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» означает отсутствующее значение, поэтому оно должно быть сохранено таким, как есть.

Мы будем очень благодарны за любую помощь в этом вопросе.

-1
05.04.2017, 06:04
2 ответа

С 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 параметров
0
28.01.2020, 05:13
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
0
28.01.2020, 05:13

Теги

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