用于输出行计数和平均值的awk数组

用于输出行计数和平均值的awk数组,awk,Awk,由于@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 我的剧本: a

由于@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)

你试图引入一个新变量是行不通的。每个数组键需要一个计数,因此变量应该是另一个数组。但是在这种情况下,您不需要添加新数组,因为数组
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
块的右括号之外的


这与问题描述的不同之处在于,密钥不是
$2
,而是
$1
$2
的组合。如果你真的需要一个单独的
$2
,你确实需要一个新的数组,但是整个过程会变得更加复杂。

加上输入、所需输出、当前输出和代码的uno!!!继续发帖,祝你好运!您了解原始awk脚本是如何工作的吗?因为如果不这样做,做你想做的事情会有点困难。(特别是,该尝试只为
l
存储了一个值,并且没有正确地将变量包含在输出中。)我编辑了您的脚本,并在过程中发现了一个明显的语法错误。您的脚本中仍然有一些严重错误,但现在,至少它可以运行了。我对
awk
(在我尝试之前)的理解是
$1
存储为k,
$2
中的唯一值定义了用于计算
$4
平均值的行。我接近了吗?谢谢:)。awk的缺点之一是缺乏调试支持(也许其他人会纠正我)。因此,您需要学习使用诸如print“NR=“NR”\tNF=“NF”\tValueForVar\u k=“k”\tValForVar\u l=“l之类的语句进行调试。然后,您将很容易看到数据流入和流出脚本。(使用小文件进行测试!)。祝你好运。非常感谢,效果很好:)谢谢你的解释:)。