我之前发帖请求帮助 计算字符串出现的次数。我现在希望搜索某个值范围内字符串的出现情况并打印出类似格式的文件(下面的范围按范围中的初始数字排序)。
500506 genome 71445 71461 0
500506 genome 308369 308384 0
500506 genome 335450 335533 0
500506 genome 425268 425293 0
500506 genome 623326 623715 0
502289 genome 308370 308384 0
502289 genome 335462 335689 0
502289 genome 425268 425290 0
我想获得一个列表,显示范围、我在文件中看到该范围的次数以及哪些行标识符具有该范围
71445-71461 1 500506
308369-308369 1 500506
308370-308384 2 500506,502289
335450-335461 1 500506
335462-335533 2 500506,502289
335534-335689 2 500506,502289
425268-425290 2 500506,502289
425291-425293 1 500506
在上面的示例中,502289 可以与 500506 完全匹配相同的范围,也可以落在该范围内的某个位置,反之亦然。这可以用一个简单的脚本来完成吗?或者我应该使用类似 perl 脚本的东西?
答案1
应在更大的数据量(超过 4 行)上测试以下脚本,以检查此语句的正确执行if ((A[1]<$3 && $4<=A[2])||(A[1]<=$3 && $4<A[2]))
awk '
BEGIN{SUBSEP="-"}
{ if (($3, $4) in ids)
ids[$3,$4]=ids[$3,$4] "," $1
else
ids[$3,$4]=$1
}
END{ for (rng1 in ids) {
split (rng1,A,SUBSEP)
for (rng2 in ids) {
split (rng2,B,SUBSEP)
if ((A[1]<B[1] && B[2]<=A[2])||(A[1]<=B[1] && B[2]<A[2]))
ids[rng2]=ids[rng2] "," ids[rng1]
}
}
for (rng in ids) {
for (i=1;i<=split(ids[rng],D,",");i++)
a[D[i]]=1
s=k=""
n=0
for (j in a) {
k=k s j
s=","
n++
}
print rng, n, k
delete a
}
}' formatted.file