유전자형을 0/1로 변환

유전자형을 0/1로 변환

다음과 같은 파일이 있습니다.

1    rs6687776    1020428    T    C    T    C    T    C    C    C    T    C    C    C    T    C

네 번째와 다섯 번째 열은 두 가지 다른 가능성이 있습니다.대립유전자그 웹사이트에서. 대립 유전자가 0있는지 T, 대립 유전자가 1있는지 표시하려면 열 6을 변경해야 합니다 C. 내 파일은 20805 x 459입니다. 따라서 다음과 같아야 합니다.

1   rs6687776   1020428 T   C   0   1   0   1   1   1   0   1   1   1   0   1

나는 시도했다:

cat file | while read line
do if [ [,6-] = [,4] ]
then
    echo "0"
    echo "1"
fi
done

그러나 나는 길이가 41610 줄인 0및 가 교대로 구성된 파일 로 끝났습니다 . 1아마도AWK더 유용한?

답변1

또 다른 접근 방식은 다음과 같습니다 awk.

$ awk '{a[$4]=0;a[$5]=1; for(i=6;i<=NF;i++){$i=a[$i]}}1;' file
1 rs6687776 1020428 T C 0 1 0 1 1 1 0 1 1 1 0 1

설명하다

  • a[$4]=0;a[$5]=1;a$4: 두 개의 키 와 을 사용하여 배열을 만듭니다 $5. 의 값은 $4으로 설정되고 0의 값은 $51로 설정됩니다.
  • for(i=6;i<=NF;i++){$i=a[$i]}: 6부터 마지막까지의 각 필드 번호에 대해 발견된 뉴클레오티드 배열에 저장된 값으로 필드를 설정합니다.

  • 1;: awk는 "이 줄 인쇄"의 약어입니다.


Perl을 사용하여 이 작업을 수행할 수도 있습니다.

$ perl -lane 's/$F[3]/0/ for @F[5..$#F]; s/$F[4]/1/ for @F[5..$#F]; print "@F"' file
1 rs6687776 1020428 T C 0 1 0 1 1 1 0 1 1 1 0 1

같은 생각이에요. make는 공백의 각 줄을 배열로 분할하는 것을 좋아 -a합니다 . 그런 다음 4번째 필드( , 배열은 0에서 시작) 에서 발견된 뉴클레오티드의 모든 케이스를 로 바꾸고 , 5번째 필드( ) 의 모든 케이스를 로 바꿉니다 . 이는 대체가 필드 6부터 끝까지만 적용된다는 의미입니다. 마지막으로 수정된 배열을 인쇄합니다.perlawk@F$F[3]0$F[4]1for @F[5..$#F]

답변2

다음을 시도해 볼 수 있습니다 awk.

awk '{ for (i = 6; i <= NF; i++) { if ($i == $4) { $i = 0; } else if ($i == $5) { $i = 1; } } } 1' file

또는:

awk '{ for (i = 6; i <= NF; i++) { $i = ($i == $4) ? 0 : 1; } } 1' file

답변3

이를 수행하는 방법은 항상 여러 가지가 있습니다. sed는 Unix 스트림 편집기입니다. 다음과 같이 입력을 수정하는 데 유용합니다.

while read one two three four five rest
do
  echo $one $two $three $four $five $(echo $rest | sed -e 's/T/0/g' -e 's/C/1/g')
done < input

-e 플래그는 구문 분석할 표현식을 제공합니다. "s" 함수는 첫 번째 인수(T 또는 C)를 검색하여 두 번째 인수(0 또는 1)로 바꿉니다. sed에 여러 표현식을 제공하여 여러 작업을 수행할 수 있습니다. 루프의 나머지 부분에서는 처음 5개 필드만 유지합니다.

관련 정보