【问题标题】:awk array to output the line count as well as averageawk 数组输出行数和平均值
【发布时间】:2015-10-08 18:34:03
【问题描述】:

感谢@karakfa,下面的awk 数组导致了输出。我正在尝试将$2 添加到数组并输出它。 $2 基本上是唯一条目出现的次数。因为我正在学习 awk 数组,所以我不知道我的尝试是否接近。

输入:

chr1:955542-955763  AGRN:exon.1 1   0
chr1:955542-955763  AGRN:exon.1 2   0
chr1:985542-985763  AGRN:exon.2 1   0
chr1:985542-985763  AGRN:exon.2 2   1

我的脚本:

awk '{k=$1 OFS $2;
    l=$2;  # Is this correct?
    s[k]+=$4; c[k]++}
  END{for(i in s)  # Is this correct?
    print i, s[i]/c[i]},
      "(lbases)"  # Is this correct?' input

当前输出:

chr1:955542-955763 AGRN:exon.1 0
chr1:985542-985763 AGRN:exon.2 0.5

期望的输出:

chr1:955542-955763 AGRN:exon.1 0   (2 bases)
chr1:985542-985763 AGRN:exon.2 0.5 (2 bases)

【问题讨论】:

  • pluse-uno 用于输入、所需输出、当前输出和代码!!!继续发帖,祝你好运!
  • 您了解原始 awk 脚本的工作原理/方式吗?因为没有那样做你想做的事情会变得更加困难。 (具体来说,该尝试完全存储 l 的 one 值,并且未在输出中正确包含该变量。)
  • 我编辑了您的脚本并在此过程中取出了一个明显的语法错误。您的脚本中仍有一些严重的错误,但现在,至少它可以运行了。
  • 我理解awk(在我尝试之前)的方式是$1 存储为k,$2 中的唯一值定义了用于计算$4 平均值的行.我接近了吗?谢谢你:)。
  • awk 的一个弱点是缺乏调试支持(也许其他人会纠正我)。所以你需要学习使用像print "NR="NR "\tNF="NF"\tValueForVar_k="k "\tValForVar_l=" l 这样的语句进行调试。然后,您将很容易看到数据流入和流出脚本。 (使用小文件进行测试!)。祝你好运。

标签: awk


【解决方案1】:

你尝试引入一个新变量是行不通的。您需要每个数组键的计数,因此变量应该是另一个数组。但在这种情况下,您不需要添加新数组,因为数组 c 已经包含每个键的计数。

awk '{k=$1 OFS $2;
    s[k]+=$4; c[k]++}
  END{for(i in s)
    print i, s[i]/c[i], c[i] " bases" }' input

还请注意,您的尝试如何不愉快地在 END 块的右大括号之外添加了“碱基”。

这与问题描述的不同之处在于key不是$2,而是$1和$2的组合。如果你真的需要唯一的密钥$2,你确实需要一个新数组,但是整个事情会变得相当复杂。

【讨论】:

  • 非常感谢,效果很好 :) 并感谢您的解释 :)。
猜你喜欢
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
相关资源
最近更新 更多