【问题标题】:How to output counts for list of active/inactive inputs?如何输出活动/非活动输入列表的计数?
【发布时间】:2013-12-12 18:15:18
【问题描述】:

我有这个输入文件(1=活动,0=非活动)

a  1
a  0                    
b  1                      
b  1
b  0
c  0 
c  0
c  0
c  0
.
.
.

想要这样的输出:

 X       repeats            active count    inactive count
 a       2 times                 1               1 
 b       3 times                 2               1 
 c       4 times                 0               4 

我试过了:

awk -F "," '{if ($2==1) a[$1]++; } END { for (i in a); print i, a[i] }'file name

但这没有用。
如何获得输出?

【问题讨论】:

  • 显示您尝试过的一些代码,但它不起作用。另外请重写您的问题,因为它很难理解
  • awk -F ","'{if ($2==1) a[$1]++; } END { for (i in a); print i, a[i] }'file name this cod 但它没有按我的意愿工作
  • 我想给我输出显示字母 a 或 b 或 c 出现了多少次,从这个结果中我想知道哪个是活动的,哪个是不活动的希望你能清楚,请注意大文件样本
  • 我已经编辑了你的问题。注意这些变化,以便您下次写出更好的问题。特别是:所有重要信息都应该在问题中,而不是在 cmets 中。
  • Jan Doggen 谢谢你给我信息因为这是我第一次问问题。在本站

标签: arrays linux if-statement awk


【解决方案1】:

只是给你一个想法,这个 awk 应该可以工作:

awk '$2{a[$1]++; next} {b[$1]++; if (!($1 in a)) a[$1]=0} END{for (i in a) print i, a[i], b[i], (a[i]+b[i])}' file
a 1 1 2
b 2 1 3
c 0 4 4

你可以按照你想要的方式格式化输出。

【讨论】:

    【解决方案2】:

    你可以试试

    awk -f r.awk input.txt
    

    input.awk 是您的数据文件,r.awk

    {
        X[$1]++
        if ($2) a[$1]++
        else ia[$1]++
    }
    END {
        printf "X\tRepeat\tActive\tInactive\n"
        for (i in X) {
            printf "%s\t%d\t%d\t%d\n", i, X[i], a[i], ia[i]
        }
    }
    

    【讨论】:

    • 非常感谢它的工作正是我想要的,我想对所有人都很好
    【解决方案3】:

    这是 GNU

    awk '{a[$1]++; if ($2!=0) {b[$1]++;c[$1]+=0} else {c[$1]++;b[$1]+=0}}END {for (i in a) print i, a[i], b[i], c[i]}' file
    

    【讨论】:

    • 你能告诉我这是什么gnu awk,不能和其他awk一起工作
    • @Jotne GNU awk 在 Windows 环境中是最重要的。
    • @captcha 你错了。许多 linux 发行版使用 gnu awk 就像所有 ubuntu 版本一样。你看不到这个,因为你输入了awk,而这指向了文件gawk。输入awk --version,你会看到GNU Awk 3.1.8这样的例子,这里有超过3000分,你应该知道这一点。
    • @Jotne 对不起,我不明白你的意思。我在 Windows 上,除了 GNU,我们没有其他 awks。
    • 好的,如果您使用仅在某些版本中存在的功能,例如在RS(记录选择器)中使用多个字符,那么写这仅适用于gnu awk是正常的。但是你没有使用任何特殊功能,所以你可以写This is an awk solution,不用说它的gnu。您的解决方案可以跨任何版本进行移植,而不仅仅是gnu。 :)
    【解决方案4】:

    这是使用awk 的另一种简单方法

    awk '{a[$1]++;b[$1]+=$2} END { for (i in a) print i,a[i],b[i],a[i]-b[i]}' file
    a 2 1 1
    b 3 2 1
    c 4 0 4
    

    无需测试,只需将 $2 列相加即可得出命中数。

    【讨论】:

      【解决方案5】:
      awk '
      { repeats[$1]++; counts[$1,$2]++ }
      END {
          for (key in repeats)
              print key, repeats[key], counts[key,1]+0, counts[key,0]+0
      }
      ' file
      

      【讨论】:

        猜你喜欢
        • 2021-08-24
        • 2020-09-12
        • 1970-01-01
        • 1970-01-01
        • 2018-06-09
        • 2021-12-31
        • 2021-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多