awk를 사용하여 열 값 바꾸기

awk를 사용하여 열 값 바꾸기

이런 파일이 있습니다.

chr1    14969   14830   2   100(26) 100(31) 100(46) 100(13) 100(26) 100(30) 100(31) 100(36) 100(38)
chr1    15795   15039   2   100(3)  100(4)  100(4)  100(3)  100(6)  100(4)  100(2)  100(6)  100(6)
chr1    16606   15948   2   80(4)   *(0)    *(0)    100(1)  75(3)   100(3)  66.67(2)    100(3)  *(0)
chr1    16606   16311   2   20(1)   *(0)    *(0)    *(0)    25(1)   *(0)    33.33(1)    *(0)    100(1)
chr1    16853   16766   2   *(0)    *(0)    *(0)    *(0)    *(0)    *(0)    100(1)  *(0)    100(2)
chr1    16857   16766   2   100(2)  100(5)  100(5)  100(1)  100(2)  100(2)  100(2)  100(4)  100(2)
chr1    17232   17056   2   100(2)  100(4)  100(8)  100(2)  100(2)  100(7)  100(6)  100(5)  100(3)
chr1    17525   17369   2   *(0)    *(0)    100(2)  *(0)    *(0)    *(0)    *(0)    *(0)    *(0)
chr1    17605   17056   1   50(9)   38.89(7)    57.89(11)   30(3)   *(0)    *(0)    40.74(11)   65.52(19)   57.14(16)
chr1    17605   17369   1   50(9)   61.11(11)   42.11(8)    70(7)   100(3)  100(8)  59.26(16)   34.48(10)   42.86(12)

열 3을 열 2로 바꾸고, 열 4가 2이면 -로 바꾸고, 그렇지 않으면 +로 바꿉니다. 출력은 아래와 같아야 합니다.

나는 이것을 awk에서하고 싶다. 나는 이것을 사용하여 열을 교환하려고 합니다. 또한 출력의 헤더 행을 그대로 유지하고 싶습니다.

awk -F '\t' -v OFS="\t" 'NR > 1{a=$2; $2=$3; $3=a;} 1' file

4열이 1인지 2인지에 따라 + 및 -로 변경한 다음 4열 이후에 원하는 만큼의 열을 인쇄하려면 어떻게 해야 합니까?

산출

chr1    14969   14830   -   100(26) 100(31) 100(46) 100(13) 100(26) 100(30) 100(31) 100(36) 100(38)
chr1    15795   15039   -   100(3)  100(4)  100(4)  100(3)  100(6)  100(4)  100(2)  100(6)  100(6)
chr1    16606   15948   -   80(4)   *(0)    *(0)    100(1)  75(3)   100(3)  66.67(2)    100(3)  *(0)
chr1    16606   16311   -   20(1)   *(0)    *(0)    *(0)    25(1)   *(0)    33.33(1)    *(0)    100(1)
chr1    16853   16766   -   *(0)    *(0)    *(0)    *(0)    *(0)    *(0)    100(1)  *(0)    100(2)
chr1    16857   16766   -   100(2)  100(5)  100(5)  100(1)  100(2)  100(2)  100(2)  100(4)  100(2)
chr1    17232   17056   -   100(2)  100(4)  100(8)  100(2)  100(2)  100(7)  100(6)  100(5)  100(3)
chr1    17525   17369   -   *(0)    *(0)    100(2)  *(0)    *(0)    *(0)    *(0)    *(0)    *(0)
chr1    17605   17056   +   50(9)   38.89(7)    57.89(11)   30(3)   *(0)    *(0)    40.74(11)   65.52(19)   57.14(16)
chr1    17605   17369   +   50(9)   61.11(11)   42.11(8)    70(7)   100(3)  100(8)  59.26(16)   34.48(10)   42.86(12)

감사해요

답변1

awk예를 들어 다음 스크립트 이름을 사용합니다 script.awk.

{
    temp=$2
    $2=$3
    $3=temp
    if ( $4 == 2 ) {
        $4="-"
    } else {
        $4="+"
    }
    print
    temp=''
}

다음은 귀하의 요구 사항을 충족하는 것 같습니다.

$ awk -F '\t' -v OFS='\t' -f script.awk input

관련 정보