0

我有一个基因列表,包括它们的开始和结束。这些基因通常有不同的亚型,所以我想创建一个具有最小起始值和最大结束值的新文件。

所以:

输入:

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 技巧!

谢谢

4

2 回答 2

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
于 2013-09-25T10:52:46.503 回答
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
于 2013-09-25T10:48:00.007 回答