关于awk:打印每个身份的最小值和最大值

Print minimum and maximum for each identity

我有一份基因的开始和结束列表。这些基因通常有不同的异构体,因此我想创建一个具有最小起始值和最大结束值的新文件。

所以:

输入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

所需的输出:

1
2
3
4
5
6
7
8
9
10
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 技巧!

谢谢


这可能对你有用:

1
2
3
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

与您的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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]
    }
'
1
2
3
4
5
6
7
8
9
10
11
12
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