打印每个身份的最小值和最大值

时间:2013-09-25 10:11:52

标签: awk grep max min dataframe

我有一系列基因的起点和终点。这些基因通常有不同的同种型,因此我想创建一个具有最小起始值和最大结束值的新文件。

所以:

输入:

Chromosome  Start position (bp) Stop position (bp)  Gene name
1   67000041    67208778    SGIP1
1   48999844    50489468    AGBL4
1   16767256    16785385    NECAP2
1   25072044    25167428    CLIC4 
1   33547850    33585783    ADC
1   16767256    16785385    NECAP2
1   16767256    16785491    NECAP2
1   8384389     8404073     SLC45A1
1   92149295    92327088    TGFBR3
1   100661810   100715376   DBT
1   92149295    92327088    TGFBR3
1   92149295    92327088    TGFBR3
1   92351836    92351836    TGFBR3
1   226420201   226496888   LIN9
1   226420000   226485422   LIN9
1   226420201   226496888   LIN9

期望的输出:

Chromosome  Start position (bp) Stop position (bp)  Gene name
1   67000041    67208778    SGIP1
1   48999844    50489468    AGBL4
1   16767256    16785491    NECAP2
1   25072044    25167428    CLIC4
1   33547850    33585783    ADC
1   8384389     8404073     SLC45A1
1   92149295    92351836    TGFBR3
1   100661810   100715376   DBT
1   226420000   226496888   LIN9

基本上,我想分别取每个基因并获得MIN {Start position(bp)}和MAX {Stop position(bp)}。

有没有grep / awk技巧呢?如果有必要,我甚至会采取Excel技巧!

由于

2 个答案:

答案 0 :(得分:2)

这可能适合你:

awk 'NR==1{print;next}
{s[$4]=!s[$4]||$2<s[$4]?$2:s[$4];e[$4]=!e[$4]||$3>e[$4]?$3:e[$4]}
END{for(x in s)print "1", s[x],e[x],x}' file

使用您的文件:

kent$  awk 'NR==1{print;next}
{s[$4]=!s[$4]||$2<s[$4]?$2:s[$4];e[$4]=!e[$4]||$3>e[$4]?$3:e[$4]}
END{for(x in s)print "1", s[x],e[x],x}' f
Chromosome  Start position (bp) Stop position (bp)  Gene name
1 67000041 67208778 SGIP1
1 226420000 226496888 LIN9
1 8384389 8404073 SLC45A1
1 33547850 33585783 ADC
1 25072044 25167428 CLIC4
1 48999844 50489468 AGBL4
1 16767256 16785491 NECAP2
1 100661810 100715376 DBT
1 92149295 92351836 TGFBR3

答案 1 :(得分:0)

awk -v OFS='\t' '
    NR==1 {print; next}
    {
        key = $1 OFS $2
        if (!(key in min)) {
            min[key]=$3; max[key]=$4
        } else {
            if ($3 < min[key]) min[key]=$3
            if ($4 > max[key]) max[key]=$4
        }
    }
    END {
        for (key in min) 
            print key, min[key], max[key]
    }
'
Chromosome  Start position (bp) Stop position (bp)  Gene name
1   48999844    50489468    AGBL4
1   92149295    92327088    TGFBR3
1   16767256    16785385    NECAP2
1   226420201   226496888   LIN9
1   25072044    25167428    CLIC4
1   226420000   226485422   LIN9
1   8384389 8404073 SLC45A1
1   33547850    33585783    ADC
1   92351836    92351836    TGFBR3
1   100661810   100715376   DBT
1   67000041    67208778    SGIP1