将特定输出和显示组合在特定标题

时间:2015-12-24 19:39:17

标签: awk

我正在尝试将所有匹配的文本组合在|的左侧,并将其输出到“Gene”列。匹配中的行数输出到“目标”列,$3到“平均深度”列的平均值,以及{{1}右侧的#的平均值到“Average GC”列。我在这方面遇到了一些麻烦,需要一些专家的帮助。谢谢你:)。

输入

=

当前输出

chr10:79793602-79793721 RPS24|gc=59.7 150.3
chr10:79795083-79795202 RPS24|gc=41.2 111.4
chr10:79797665-79797784 RPS24|gc=37 69.8
chr11:119077113-119077232 CBL|gc=67.9 27.3
chr11:119103143-119103420 CBL|gc=41.9 240.3
chr11:119142430-119142606 CBL|gc=42.6 177.1
chr11:119144563-119144749 CBL|gc=46.2 324.4

所需的输出

Gene     TargetsAverage DepthAverage GC
gc           803     0.0     0.0

AWK

ID         times          depth         GC
RPS24        3            110.5         46.0
CBL          4            192.3         49.7

2 个答案:

答案 0 :(得分:1)

@Chris - 您对该问题的编辑并不是很有帮助,但我可以确认,除了第一个printf语句外,程序按预期运行,这符合“所需输出”。我使用了三种不同的heap.findObject(4077522088) s;输出之间的唯一区别是(如预期的那样)行的排序。您可能必须更加具体地了解您正在使用的awk版本。

答案 1 :(得分:1)

TXR中的解决方案:

$ txr table2.txr data
ID        times          depth         GC
RPS24       3            110.5         46.0
CBL         4            192.3         49.7

table2.txr中的代码:

@(output)
ID        times          depth         GC
@(end)
@(repeat)
@  (all)
@nil:@nil-@nil @id|@nil
@  (and)
@    (collect :gap 0)
@nil:@nil-@nil @id|gc=@gc @dep
@    (set (gc dep) (@(tofloat gc) @(tofloat dep)))
@    (end)
@    (bind n @(length gc))
@    (bind avg-gc @(format nil "~,1f"
                           (/ [reduce-left + gc] n)))
@    (bind avg-dep @(format nil "~,1f"
                            (/ [reduce-left + dep] n)))
@    (output)
@{id   9}   @{n 6}       @{avg-dep 13} @{avg-gc}
@    (end)
@  (end)
@(end)

将具有相同ID的条目整合在一起的是all指令的两个并行分支。第一个分支松散地匹配单行的模式,提取ID,将其绑定到id变量。此变量对第二个分支可见,其外观引入了反向引用约束。这里,多个连续的(:gap 0)行在同一位置匹配(因此包括在all的第一个分支中匹配的那一行)。仅处理匹配id的行;遇到不匹配的collect(由于id约束)或输入结束时,:gap 0结束。