生信(一)对BED文件进行排序
2019-11-21 本文已影响0人
生信了
原创:hxj7
关键词:bed; sort; cmp; key; alpha-numeric
问题
在处理NGS数据时,经常要对BED文件进行排序。比如BED文件长这样,分隔符是’\t’:
我们想按照如下规则进行排序:
- 第一列按照染色体编号进行排序,排序后应该是chr1, chr2, chr4, chr5, chr10, chr20, chrX。
- 第二列和第三列按照数字序进行排序。
第一个子问题
首先,我们先来看看如何对第二列进行排序。
刚接触GNU sort命令的同学可能都写出过类似下面的命令:
并且期待结果会是
image
但是实际上的结果是
image
为什么?这是因为sort默认按照字典排序规则对字符串进行排序。比如,字符串”10”的第一个字母是”1”,比字符串”2”的第一个字母”2”小,所以字符串”10”小于字符串”2”。我们要想按照数值大小进行排序,正确的做法是要给sort加上”-n”选项。 image
这样就会得到预期的结果了。
第二个子问题
如何对染色体编号进行排序呢?用上面的”-n”选项可以吗?
如果我们给出这样的命令:
答案会是:
image
很显然这个结果是不对的。虽然加了”-n”选项,但是由于染色体编号都是”chr”开头的,所以sort命令仍然将”chr”后面的数字视作字符串,按照字典排序规则进行排序。
正确的做法是使用”-V”选项。
image
将会得到正确答案:
image
最初的问题
有了两个子问题的答案,让我们回到文章开始的问题:如何对BED文件进行排序?我们给出如下命令:
image
其中-k选项是指定第几列。
这样的话文章开头提到的那个BED示例文件经过排序后就会变成
image
Python版本
这里我们也分享一种Python对BED文件进行排序的方法。简单起见,假设我们只对BED文件的第一列(染色体编号)进行排序。代码如下:
image
上面的代码其实只是利用了Python中的sorted函数,该函数原型是:
image
其中:
(图片来源:http://www.runoob.com/python/python-func-sorted.html)
并且值得注意的是,上面的代码使用了x.partition(‘\t’)而非x.split(‘\t’)。当只需要解析字符串的第一个“字段”的时候,partition()函数的效率比split()的效率高,因为它不会解析剩余的“字段”。
如果有任何问题欢迎交流!
(公众号:生信了)
image