hapmap 데이터세트의 문자 바꾸기

hapmap 데이터세트의 문자 바꾸기

내 데이터와 관련된 다음 문제를 해결하기 위해 bash 코드를 사용할 생각입니다.

hapmap 형식의 다음 데이터세트를 고려하면 "대립유전자" 열의 데이터를 기반으로 일부 문자(이 경우 문자)를 바꿔야 합니다. 대립유전자 열의 데이터는 4개의 문자 쌍(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

그리고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.*처음 4개를 제외한 모든 열을 가져옵니다.
  • $&=~s|$F[2]|$F[1]일치하는 부분에 대해 또 다른 교체를 수행합니다(처음 4개 열 제외).
    • $F[2]뒤의 문자를 포함 /하고 $F[1]앞의 문자를 포함합니다./
  • 수정자는 r대체된 최종 문자열을 반환하고 e수정자는 대체 부분에서 Perl 코드의 사용을 허용합니다.
  • 동일한 패턴이 다시 사용되므로 두 번째 교체도 다음과 같이 단축될 수 있습니다.s//$&=~s|[RYSWKM]|$F[2]|gr/e
  • 바라보다명령 스위치-lape옵션 설명

답변2

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

관련 정보