awk를 사용하여 기존 열을 기반으로 한 값으로 새 열을 추가하는 방법

awk를 사용하여 기존 열을 기반으로 한 값으로 새 열을 추가하는 방법

여러 열이 포함된 파일이 있습니다. 이 파일에 있는 두 열의 값을 기반으로 추가 열을 생성하고 싶습니다.

입력 예:

A B C D E F
1 2 T TACA A 3 2
3 4 I R 8 2
9 3 A C 9 3
  1. 3열과 4열(C와 D로 표시됨)의 값이 문자 A, C, G 또는 T인 경우 7열은 P여야 합니다.
  2. 3열과 4열의 문자가 I, D, R인 경우 7열은 Q여야 합니다.
  3. 3열이나 4열에 여러 글자가 있는 경우 7열은 Q여야 합니다.

원하는 출력:

A B C D E F G
1 2 T TACA A 3 2 Q
3 4 I R 8 2 Q
9 3 A C 9 3 P

열 3 값 중 일부를 "1"로 바꾸는 것을 제외하고 다음 코드가 있습니다. 열 1-6을 변경하지 않고 유지하고 싶습니다.

awk '{if ((($3!="A" && $3!="C" && $3!="G" && $3!="T") || ($3="I" || $3="D" || $3="R")) || (($4!="A" && $4!="C" && $4!="G" && $4!="T") || ($4="I" || $4="D" || $4="R"))) { $7 = "INDEL" } else { $7 = "SNP" }}1' filename > newfilename

답변1

이는 다음에 적용됩니다 mawk.

awk 'NR==1{$7="G";print;next} \
  $3~/^[A,C,G,T]$/ || $4~/^[A,C,G,T]$/ {$7="P"} \
  $3~/^[I,D,R]$/ || $4~/^[I,D,R]$/ {$7="Q"} \
  $4~/[A-Z][A-Z]/ || $3~/[A-Z][A-Z]/ {$7="Q"} 1' file
  1. 행: 첫 번째 행에 제목을 적습니다 G.
  2. 행: $3A $4, C, G 또는 T이면 $7예입니다 P.
  3. 행: $3I $4, D 또는 R이면 $7예입니다 Q.
  4. 행: 여러 글자 $3인 경우 예입니다 . 마지막으로 모든 줄을 인쇄합니다.$4$7Q1

답변2

이 코드는 설명이 필요 없으며 이해하기 쉽습니다. 요구 사항에 따라 마지막 else 조건을 변경하거나 무시할 수 있습니다. "input_file.txt"라는 입력 파일이 있고 "XXXX.awk"라는 다른 파일에 awk 프로그램을 생성한다고 가정합니다. 이제 명령줄을 사용하여 실행해 보세요.

awk -f XXXX.awk 입력 파일.txt

    BEGIN { 
       FS=" ";
    }
    {
        if(NR==1) print $0" G";
        else if(length($4)>1 || length($3)>1) print $0" Q";
        else if($3 ~ /[I,D,R]/ && $4 ~ /[I,D,R]/) print $0" Q";
        else if($3 ~ /[A,C,G,T]/ && $4 ~ /[A,C,G,T]/) print $0" P";
        else print $0" NA";
    }

관련 정보