前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >生信(一)对BED文件进行排序

生信(一)对BED文件进行排序

作者头像
一只羊
发布2019-07-27 19:01:06
3.4K0
发布2019-07-27 19:01:06
举报
文章被收录于专栏:生信了生信了

关键词:bed; sort; cmp; key; alpha-numeric

问题

在处理NGS数据时,经常要对BED文件进行排序。假设BED文件长这样,分隔符是’\t’:

我们想按照如下规则进行排序:

  1. 第一列按照染色体编号进行排序,排序后应该是chr1,chr2, chr4, chr5, chr10, chr20, chrX。
  2. 第二列和第三列按照数字序进行排序。

第一个子问题

首先,我们先来看看如何对第二列进行排序。

刚接触GNU sort命令的同学可能都写出过类似下面的命令:

并且期待结果会是

但是实际上的结果是

为什么?这是因为sort默认按照字典排序规则对字符串进行排序。比如,字符串”10”的第一个字母是”1”,比字符串”2”的第一个字母”2”小,所以字符串”10”小于字符串”2”。我们要想按照数值大小进行排序,正确的做法是要给sort加上”-n”选项。

这样就会得到预期的结果了。

第二个子问题

如何对染色体编号进行排序呢?用上面的”-n”选项可以吗?

如果我们给出这样的命令:

答案会是:

很显然这个结果是不对的。虽然加了”-n”选项,但是由于染色体编号都是”chr”开头的,所以sort命令仍然将”chr”后面的数字视作字符串,按照字典排序规则进行排序。

正确的做法是使用”-V”选项。

得到正确答案:

最初的问题

有了两个子问题的答案,让我们回到文章开始的问题:如何对BED文件进行排序?我们给出如下命令:

其中-k选项是指定第几列。

这样的话文章开头提到的那个BED示例文件经过排序后就会变成

这样问题就得到了圆满解决!

Python版本

这里我们也分享一种Python对BED文件进行排序的方法。简单起见,假设我们只对BED文件的第一列(染色体编号)进行排序。代码如下:

上面的代码其实只是利用了Python中的sorted函数,该函数原型是:

其中:

并且值得注意的是,上面的代码使用了x.partition(‘\t’)而非x.split(‘\t’)。当只需要解析字符串的第一个“字段”的时候,partition()函数的效率比split()的效率高,因为它不会解析剩余的“字段”。

如果有任何问题欢迎交流!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信了 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档