我正在尝试将所有匹配的文本组合在|
的左侧,并将其输出到“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
答案 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
结束。