【问题标题】:Counting number of zeros in a row, adding count to new column [closed]计算一行中的零个数,将计数添加到新列[关闭]
【发布时间】:2022-01-09 23:29:35
【问题描述】:

我有一个制表符分隔的表格,如下所示:

chr1 100 110 + 2 3 0 8 6
chr1 150 200 + 1 4 0 2 0
chr1 200 220 + 1 4 2 0 0
chr1 250 260 + 4 2 6 1 3

我想计算第 5-9 列中有多少个零,并将该数字添加到第 10 列:

chr1 100 110 + 2 3 0 8 6 1
chr1 150 200 + 1 4 0 2 0 2
chr1 200 220 + 1 4 2 0 0 2
chr1 250 260 + 4 2 6 1 3 0

最终,目标是仅对那些不超过 4 个零的行(至少 2 列非零)进行子集化。我知道如何用awk 做这个子集,但我不知道如何计算这些列中的零。如果有更简单的方法只要求在第 5-9 列之间至少有两列非零,那将是理想的。

【问题讨论】:

  • 您要选择具有两个零的行或添加一个具有零计数的新列?
  • 与其发布一些输出然后说Ultimately, the goal... 并描述您想做的不同的事情,而是说明最终目标是什么并提供给定目标的预期输出。还要添加您的代码,以表明您在询问之前已尝试自己解决问题。

标签: awk text-formatting


【解决方案1】:

rethab 的回答完美地满足了您添加额外列的第一个要求。这满足了您的第二个要求(仅打印少于 4 个零的行)。使用 awk(使用 GNU awk 测试),只需计算字段 5 和字段 9(变量 nz)之间的非零字段,仅在大于或等于 2 时打印:

$ cat foo.txt
chr1 100 110 + 2 3 0 8 6
chr1 150 200 + 1 4 0 2 0
chr1 250 260 + 0 0 0 1 0
chr1 200 220 + 1 4 2 0 0
chr1 250 260 + 4 2 6 1 3
$ awk '{nz=0; for(i=5;i<=9;i++) nz+=($i!=0)} nz>=2' foo.txt
chr1 100 110 + 2 3 0 8 6
chr1 150 200 + 1 4 0 2 0
chr1 200 220 + 1 4 2 0 0
chr1 250 260 + 4 2 6 1 3

【讨论】:

    【解决方案2】:

    此脚本计算零并将它们附加为最后一列:

    awk '{
      cnt=0
      for (i=5;i<=9;i++) {
        cnt+=($i==0)
      }
      print $0, cnt
    }' inputs.txt
    

    请注意,$i==0 如果条件为真则为 1,否则为 0。因此,这可以作为计数器的增量。

    【讨论】:

      【解决方案3】:

      您可以使用 gsub 返回每​​行的替换数量(这里是每个 s 字符串),然后打印数字:

      awk '{s=$5$6$7$8$9;x=gsub(/0/,"&",s);print $0, x}' file
      chr1 100 110 + 2 3 0 8 6 1
      chr1 150 200 + 1 4 0 2 0 2
      chr1 200 220 + 1 4 2 0 0 2
      chr1 250 260 + 4 2 6 1 3 0
      

      【讨论】:

      • 这将失败,如 10 之类的数字。
      • 这里是to count how many zeros are in columns 5-9 的问题。
      猜你喜欢
      • 2012-09-06
      • 2022-01-24
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 2019-10-09
      • 2011-07-18
      相关资源
      最近更新 更多