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

関連情報