2015-10-08 31 views
3

感谢@karakfa以下awk数组导致输出。我正在尝试将$2添加到阵列并输出。 $2基本上是唯一条目出现的次数。由于我正在使用awk阵列,我不知道我的尝试是否接近。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) 
+0

用于输入,期望输出,电流输出和代码的pluse-uno!继续发帖,祝你好运! – shellter

+0

你知道原始awk脚本的工作原理吗?因为如果没有这样做你想要的会更加困难。 (具体来说,这个尝试为'l'存储**正好**的值,并且不会正确地在输出中包含变量。) –

+0

我编辑了你的脚本,并在过程中发现了明显的语法错误。您的脚本中仍然存在一些严重的错误,但现在至少它可以运行。 – tripleee

回答

4

你试图引入一个新变量是行不通的。您需要每个数组键的计数,因此该变量应该是另一个数组。但在这种情况下,您不需要添加新数组,因为数组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,那么你确实需要一个新的数组,但是整个事情会变得相当复杂。

+0

非常感谢,作品很棒:)并感谢你的解释:)。 – Chris