查找不同文件之间的重叠范围

时间:2018-02-27 14:24:34

标签: bash unix range

我有两个文件,每个文件都有一个列形成范围。

档案1

  

23241-24234
  10023-12300
  75432-82324

文件2

  

16722-17234
  92000-94532
  23600-25000

我正在寻找与两个文件之间的某个%(例如50%)重叠的范围

在前面的示例中,仅打印以下内容(50%重叠):

  

23241-24234 23600-25000

我可以使用Python来做到这一点,但是想知道是否有更快的bash命令可以做同样的事情。

2 个答案:

答案 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 intersecthttps://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 程序,但是正如您从工具的文档中看到的那样,它有大量选项,一旦您的需求变得更加复杂,这些选项可能对您有用