我有两个文件,每个文件都有一个列形成范围。
档案1
23241-24234
10023-12300
75432-82324
文件2
16722-17234
92000-94532
23600-25000
我正在寻找与两个文件之间的某个%(例如50%)重叠的范围
在前面的示例中,仅打印以下内容(50%重叠):
23241-24234 23600-25000
我可以使用Python来做到这一点,但是想知道是否有更快的bash命令可以做同样的事情。
答案 0 :(得分:1)
在Python中,我会写这样的东西:
f1='''\
23241-24234
10023-12300
75432-82324'''
f2='''\
16722-17234
92000-94532
23600-25000'''
f1ranges=[tuple(map(int, l.split('-'))) for l in f1.splitlines()]
for l in f2.splitlines():
b,e=map(int, l.split('-'))
s2=set(range(b,e))
for r in f1ranges:
s1=set(range(*r))
if len(s1 & s2)>len(s1)/2:
print r,(b,e)
打印:
(23241, 24234) (23600, 25000)
使用Bash实用程序很难超越它,但awk
将是唯一可以使用的实用程序。
我在Python中使用的方法使用集合的交集的快捷方式来确定重叠间隔的长度。您需要复制该集类型功能或使用算术比较。
这是一个awk
框架:
awk 'FNR==NR { f1[$0]; next }
{
split($0,a,"-")
for (e in f1) {
split(e,b,"-")
# add your range comparison logic here...
print a[1],a[2]," ",b[1],b[2], a[2]-b[1], b[2]-a[1]
}
} ' f1 f2
答案 1 :(得分:0)
将其转换为“假”床格式并使用bedtools intersect
; https://bedtools.readthedocs.io/en/latest/content/tools/intersect.html
$ cat 1.bed
chr1 23241 24234
chr1 10023 12300
chr1 75432 82324
$ cat 2.bed
chr1 16722 17234
chr1 92000 94532
chr1 23600 25000
# sort both files
$ sort -k 1,1 -k2,2n 1.bed > 1.sort.bed
$ sort -k 1,1 -k2,2n 2.bed > 2.sort.bed
$ bedtools intersect -wa -wb -f 0.5 -a 1.sort.bed -b 2.sort.bed
chr1 23241 24234 chr1 23600 25000
您可以解析输出并在之后去除 chr1
标签
显然,bedtools
不是内置的 bash 程序,但是正如您从工具的文档中看到的那样,它有大量选项,一旦您的需求变得更加复杂,这些选项可能对您有用