【发布时间】:2021-11-05 07:15:47
【问题描述】:
我试图找出 range1 的数字 [a 和 b 列] 是子集还是位于 range2 的列 [b 和 c 列] 之间。
范围1
a b
15 20
8 10
37 44
32 37
范围2
a b c
chr1 6 12
chr2 13 21
chr3 31 35
chr4 36 45
输出:
a b c
chr1 6 12 8 10
chr2 13 21 15 20
chr4 36 45 37 44
我想比较 range1[a] 和 range2[b] 以及 range1[b] 和 range2[c]。一对一比较。
例如在第一次运行中:range-1 的第一行与 range-2 的所有其他行。但是 range1[a] 应该只与 range2[b] 比较,同样,range1[b] 应该只与 range2[c] 比较。基于此,我只写了一个标准:
lbs[i] && lbsf1[j] <= ubs[i] && ubsf1[j] >= lbs[i] && ubsf1[j] <= ubs[i]
r1[a] r2[b] r1[b] r2[c]
15 > 6 20 < 12 False
15 > 13 20 < 21 True
15 > 31 20 < 35 False
15 > 36 20 < 45 False
我试图从这段代码中学习[如果我们想检查一个数字是否在特定范围内,它是有效的],因此我尝试为两个数字修改相同的值。但是没有用,我觉得我无法正确读取第二个文件。
代码:[参考但稍作修改]
#!/bin/bash
awk -F'\t' '
# 1st pass (fileB): read the lower and upper range bounds
FNR==NR { lbs[++count] = $2+0; ubs[count] = $3+0; next }
# 2nd pass (fileA): check each line against all ranges.
{ lbsf1[++countf1] = $1+0; ubsf1[countf1] = $2+0;
for(i=1;i<=count;++i)
{
for(j=1;j<=countf1;++j)
{
if (lbsf1[j] >= lbs[i] && lbsf1[j] <= ubs[i] && ubsf1[j] >= lbs[i] && ubsf1[j] <= ubs[i])
{ print lbs[i]"\t"ubs[i]"\t"lbsf1[j]"\t"ubsf1[j] ; next }
}
}
}
' range2 range1
这段代码给了我输出:
6 12 8 10
6 12 8 10
6 12 8 10
谢谢。
【问题讨论】: