数据分析中会经常用到bed文件,有时候bed文件中的区域有重叠时会影响统计结果,或者没有按照顺序排序时会影响代码的逻辑。合并bed文件或者文件中的区域是经常进行的。

我常用的工具是bedtools的merge功能,官方示例如下:

1
2
3
4
5
6
7
8
$ cat A.bed
chr1  100  200
chr1  180  250
chr1  250  500
chr1  501  1000
$ bedtools merge -i A.bed
chr1  100  500
chr1  501  1000

bedtools的merge功能强大的地方,更在于在合并的时候,可以进行一下操作。如下操作,通过-c指定要操作的目标列,-o指定操作动作。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$ cat A.bed
chr1  100  200   a1  1 +
chr1  180  250   a2  2 +
chr1  250  500   a3  3 -
chr1  501  1000  a4  4 +

$ bedtools merge -i A.bed -S +
# 合并正链的区域feature或者interval
chr1  100 250
chr1  501 1000

$  bedtools merge -i A.bed -c 5,5,5,6 -o mean,min,max,collapse
# 计算重叠区域第五列的平均值、最小值、最大值
# 将重叠区域的第六列按顺序列出
chr1  100 500 2 1 3 +,+,-
chr1  501 1000  4 4 4 +

我个人写的bash脚本如下:

1
2
3
4
5
6
7
8
#! /bin/bash

# 1)合并所有传入脚本中的bed文件,并生成一个中间文件
cat $@ | sort -k1,1 -k2,2n > bedtools.in.sorted.bed
# 2)合并中间文件,并输出到标准输出流中,供下一步处理
bedtools merge -i bedtools.in.sorted.bed
# 3)删除中间文件
rm bedtools.in.sorted.bed

参考:

http://bedtools.readthedocs.io/en/latest/content/tools/merge.html

####################################################################

#版权所有 转载请告知 版权归作者所有 如有侵权 一经发现 必将追究其法律责任

#Author: Jason

####################################################################