如何用数字代码替换文件中的每两列(例如,第4列和第5列为1)? (通过awk)

时间:2012-03-19 08:54:20

标签: linux awk gsub

我有一个这种格式的文件:

probeset_id alleleA alleleB 562_201 562_201 562_202 562_202 562_203 562_203 562_204 562_204 562_205 562_205 562_206 562_206 562_207 562_207 562_208 562_208 562_209 562_209 562_258 562_258
AX-76431849 T C T T C T T T T T C C C T T C T T T C C T
AX-76431844 A G A A G A A A A A G G G A A G A A A G G A
AX-76431845 T C T T C T T T T T C C C T T C T T T C C T

我想用数字代码替换第4列到第20列!我想根据alleleA和alleleB列将每2列替换为1个代码。

如果第4和第5列中的字母与alleleA(第2列)相似,则将第4和第5个替换为0,如果第4列中的字母与alleleA(第2列)相似且第5列中的字母类似于alleleB(第3列),或者第4列中的字母与alleleB(第3列)相似,第5列中的字母与alleleA(第2列)相似,则将第4列和第5列替换为1,如果第4列和第5列中的字母与alleleB(第3列)相似,则将第4和第5列替换为2 所以我想要的输出是:

probeset_id alleleA alleleB 562_201 562_201 562_202 562_202 562_203 562_203 562_204 562_204 562_205 562_205 562_206 562_206 562_207 562_207 562_208 562_208 562_209 562_209 562_258 562_258
    AX-76431849 T C 0 1 0 0 2 1 1 0 1 1
    AX-76431844 A G 0 1 0 0 2 1 1 0 1 1
    AX-76431845 T C 0 1 0 0 2 1 1 0 1 1

我有这段代码:

awk 'NR == 1 { print; next } NR>1 {for (i=4;i<=NF;i++) if ( $i == $2) gsub ($i, 1 );for (i=4;i<=NF;i++) if ( $i == $3) gsub ($i, 2 );print}' input_test.txt > output_test.txt

但这只是根据Allele A&amp; A替换每一列。 B.我无法做的是一起选择2列,如下所示:

(i=4;i<=NF;i++) if (($i == $3) && ($i+1 == $2)) gsub ($i & $i+1 , 1)

由于

2 个答案:

答案 0 :(得分:1)

awk '
NR==1{
    print
    next
}

{
    for(i=4;i<=NF;i+=2)
    {
        if($i!=$(i+1))
            $i=1
        else if($i==$2)
            $i=0
        else
            $i=2
        $(i+1)=""
    }
    print
}' input.txt

答案 1 :(得分:1)

一种方式:

script.awk的内容:

FNR == 1 { 
    print
    next
}

FNR > 1 { 
    for ( i = 4; i <= NF; i += 2 ) { 
        if ( $i == $2 && $(i+1) == $2 ) { 
            value = 0 
        } else if ( $i == $3 && $(i+1) == $3 ) { 
            value = 2 
        } else {
            value = 1 
        }   

        $i = ""
        $(i+1) = value
    }   

    print
}

infile的内容:

probeset_id alleleA alleleB 562_201 562_201 562_202 562_202 562_203 562_203 562_204 562_204 562_205 562_205 562_206 562_206 562_207 562_207 562_208 562_208 562_209 562_209 562_258 562_258
AX-76431849 T C T T C T T T T T C C C T T C T T T C C T
AX-76431844 A G A A G A A A A A G G G A A G A A A G G A
AX-76431845 T C T T C T T T T T C C C T T C T T T C C T

像以下一样运行:

awk -f script.awk infile

结果:

probeset_id alleleA alleleB 562_201 562_201 562_202 562_202 562_203 562_203 562_204 562_204 562_205 562_205 562_206 562_206 562_207 562_207 562_208 562_208 562_209 562_209 562_258 562_258
AX-76431849 T C  0  1  0  0  2  1  1  0  1  1
AX-76431844 A G  0  1  0  0  2  1  1  0  1  1
AX-76431845 T C  0  1  0  0  2  1  1  0  1  1