【问题标题】:Print minimum and maximum for each identity打印每个身份的最小值和最大值
【发布时间】:2013-09-30 21:04:27
【问题描述】:

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

所以:

输入:

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

谢谢

【问题讨论】:

    标签: awk grep max min dataframe


    【解决方案1】:

    这可能对你有用:

    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
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        猜你喜欢
        • 2015-02-20
        • 1970-01-01
        • 2019-05-26
        • 2021-07-09
        • 2020-09-06
        • 2020-09-19
        • 2020-03-10
        • 1970-01-01
        • 2016-10-06
        相关资源
        最近更新 更多