두 문자 열을 두 개의 개별 열로 읽습니다.

두 문자 열을 두 개의 개별 열로 읽습니다.

유전자형 데이터가 포함된 파일이 있습니다. 두 번째 열에는 아래와 같이 연결된 특정 유전 변이의 두 대립 유전자가 있습니다.

rs969931    CA  1.000   2.000   2.000   2.000   2.000   2.000   1.000   1.000
rs2745406   CT  0.000   2.000   2.000   1.000   1.000   2.000   1.000   1.000
rs6939431   AG  0.000   0.000   0.000   0.000   0.000   0.000   1.000   0.000
rs1233427   AG  1.000   2.000   2.000   2.000   2.000   1.000   1.000   1.000
rs1233426   AG  1.000   2.000   2.000   2.000   2.000   1.000   1.000   1.000
rs1233425   GC  1.000   1.999   1.999   2.000   2.000   2.000   1.000   1.000
rs362546    GA  1.000   2.000   2.000   2.000   2.000   1.000   1.000   1.000
rs909968    AG  0.000   2.000   2.000   1.000   1.000   1.000   1.000   1.000
rs909967    GA  1.000   2.000   2.000   2.000   2.000   2.000   1.000   1.000
rs886381    AG  0.000   0.000   0.000   0.000   0.000   0.000   0.000   1.000

대립 유전자를 두 개의 별도 열로 사용하여 새 파일을 만들어야 합니다. 즉, 두 번째 열을 두 개의 열로 분할해야 합니다. 아래는 원하는 출력입니다. 이를 달성하기 위해 awk에서 여러 필드 구분 기호를 지정하는 방법이 있습니까?

rs969931    C A  1.000  2.000   2.000   2.000   2.000   2.000   1.000   1.000
rs2745406   C T  0.000  2.000   2.000   1.000   1.000   2.000   1.000   1.000
rs6939431   A G  0.000  0.000   0.000   0.000   0.000   0.000   1.000   0.000
rs1233427   A G  1.000  2.000   2.000   2.000   2.000   1.000   1.000   1.000
rs1233426   A G  1.000  2.000   2.000   2.000   2.000   1.000   1.000   1.000
rs1233425   G C  1.000  1.999   1.999   2.000   2.000   2.000   1.000   1.000
rs362546    G A  1.000  2.000   2.000   2.000   2.000   1.000   1.000   1.000
rs909968    A G  0.000  2.000   2.000   1.000   1.000   1.000   1.000   1.000
rs909967    G A  1.000  2.000   2.000   2.000   2.000   2.000   1.000   1.000
rs886381    A G  0.000  0.000   0.000   0.000   0.000   0.000   0.000   1.000

답변1

sub이 작업을 수행하려면 다음 기능을 사용할 수 있습니다 awk.

awk 'sub(/./,"& ",$2)1;' file

탭으로 구분된 출력을 원하면 다음을 사용할 수 있습니다.

awk -v OFS="\t" 'sub(/./,"&\t",$2)1;' file

또는 다양한 다른 도구에서:

  • 진주

    perl -alne '$F[1]=~s/./$& /; print "@F"' file
    

    또는 탭으로 구분된 출력의 경우:

    perl -alne '$F[1]=~s/./$&\t/; print join "\t",@F' file
    
  • 암소 비슷한 일종의 영양sed

    sed -r 's/\S+\s+\S/& /' file
    
  • 다른sed

    sed  's/^[[:alnum:]]*[[:blank:]]*./& /' file
    
  • 껍데기

    while read -r snp nt rest; do 
        printf "%s\t%s\t%s\t%s\n" "$snp" "${nt:0:1}" "${nt:0:1}" "$rest"
    done < file
    

답변2

사용 gsub:awk

awk 'gsub(""," ",$2)1' file

결과:

rs969931  C A  1.000 2.000 2.000 2.000 2.000 2.000 1.000 1.000
rs2745406  C T  0.000 2.000 2.000 1.000 1.000 2.000 1.000 1.000
rs6939431  A G  0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000
rs1233427  A G  1.000 2.000 2.000 2.000 2.000 1.000 1.000 1.000
rs1233426  A G  1.000 2.000 2.000 2.000 2.000 1.000 1.000 1.000
rs1233425  G C  1.000 1.999 1.999 2.000 2.000 2.000 1.000 1.000
rs362546  G A  1.000 2.000 2.000 2.000 2.000 1.000 1.000 1.000
rs909968  A G  0.000 2.000 2.000 1.000 1.000 1.000 1.000 1.000
rs909967  G A  1.000 2.000 2.000 2.000 2.000 2.000 1.000 1.000
rs886381  A G  0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000

관련 정보