shell高级技巧:提取vcf文件中一个contig

shell高级技巧:提取vcf文件中一个contig这是一个很小众的需求 大部分变异检测都是基于组装质量比较高的基因组 而不是那种初步拼接的 contig 由于初步拼接的参考序列通常会有成千上万个 contig 序列 也就导致在 VCF 的头文件的 contig ID xxx length xxx 部分会有成千上万个 contig 将这个文件加载到 IGV 时 IGV 会去解析 VCF 这将会是非常缓慢的过程 最好的策略就是只提取其 ID xxx length xxx

这是一个很小众的需求。大部分变异检测都是基于组装质量比较高的基因组,而不是那种初步拼接的contig。

由于初步拼接的参考序列通常会有成千上万个contig序列,也就导致在VCF的头文件的contig=<ID=xxx,length=xxx>部分会有成千上万个contig,将这个文件加载到IGV时, IGV会去解析VCF,这将会是非常缓慢的过程,最好的策略就是只提取其中一个contig查看。

一开始,我想到的是这个方法,直接用bcftools去提取目标contig

bcftools view some_variants.bcf contig_1 

但是,你会发现HEADER部分还是会保留原来的信息。怎么办呢?

我们这里会用到一个Shell高级技巧–subshell。举个例子,比如说同时查看一个文件的头10行和后10行.

(head -n 10 ; tail -n10 ) < ~/referece/annotaiton/TAIR10/TAIR10_GFF3_genes.bed 

这里的()就是一个subshell, 它的作用就是同时执行()中的所有命令。

用到此处,就是同时完成提取VCF的header部分并只保留目标contig和提取目标区间的所有记录这两个任务,然后保存为vcf.gz格式。

(bcftools view -h some_variants.bcf | grep -v "contig" | sed "/^reference/a $(bcftools view -h some_variants.bcf | grep -w "ID=contig_1")" ; bcftools view -H some_variants.bcf contig_1 ) | bcftools view -Oz -o contig_1.vcf.gz 

上面是一个非常复杂的shell命令,希望你能看懂。

这里面重复出现了两个变量,一个是some_variants.bcf,一个是contig_1, 我们可以将其用$1$2代替,然后添加到你的~/.bashrc中,如下所示

# function subvcf() { (bcftools view -h $1 | grep -v "contig" | sed "/^reference/a $(bcftools view -h $1| grep -w "ID=$2")" ; bcftools view -H $1 $2 ) | bcftools view -Oz -o $2.vcf.gz && bcftoos index $2.vcf.gz } 

最后用source ~/.bashrc添加刚才的函数到环境变量中,最后就是subvcf some_variants.bcf contig_1 代替之前的长串命令。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234014.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 网站加载速度优化的14个技巧

    网站加载速度优化的14个技巧

    2021年10月14日
    59
  • C++实现二叉树层序遍历

    C++实现二叉树层序遍历层序遍历图示实现二叉树的层次遍历,要利用到队列。基本思想:1.先将根节点放到队列中2.根节点弹出队列,然后将根节点的左、右儿子入队3.弹出左儿子,放入左儿子的左右儿子4.弹出右儿子,放入右儿子的左右儿子5.重复3、4步图示过程:所用的二叉树如下队列的操作:将根节点弹出,放入左右儿子:将B节点弹出,放入左右儿子(只有右儿子):把D节点弹出,放入左右儿子:C、E、F都没有儿子节点,所以直接弹出队列即可: C++代码实现1.利用前序遍历思想输入二叉树。(前序

    2022年5月21日
    28
  • xml文件格式化[通俗易懂]

    xml文件格式化[通俗易懂]xml文件格式化看到这样的xml文档是否你的脑袋已经萌化:(ps:此时的内心是崩溃的~~~)那么让我们用UE编辑器进行对xml进行格式化吧!编辑软件:(ps:xml格式化前)**第一步:打开UE文件编辑软件第二步:打开咋们需要格式的xml文件第三步:点击格式第四步:选择XMLlint工具第五步:在弹出的窗口,勾选标签“重格式化并重缩进输出,缩进位置”(ps:英文:Reformat

    2022年7月16日
    25
  • HTML转word_讯飞语记怎么变成word文档

    HTML转word_讯飞语记怎么变成word文档HTML转word背景介绍1.使用POI进行转化1.1思路1.2代码示例1.3思考2.使用jacob进行转化2.1思路2.2代码示例2.3思考3.总结背景介绍业务:将平台中尽调笔记(富文本)以word形式导出。1.使用POI进行转化依赖jarpoi-3.17.jarpoi-excelant-3.17.jarpoi-ooxml-3.17.jarpoi-ooxml-…

    2022年10月12日
    2
  • html content属性_HTTP函数

    html content属性_HTTP函数关于HttpEntity的用法HttpEntity表示http的request和resposne实体,它由消息头和消息体组成。从HttpEntity中可以获取http请求头和回应头,也可以获取http请求体和回应体信息。HttpEntity的使用,与@RequestBody、@ResponseBody类似。HttpEntity的典型应用是配合RestTemplate,在微服务项目中的应用(参见API示例)用户登录示例:步骤一:在login.jsp发送ajax请求,发送之前添加请求头信息

    2025年8月14日
    2
  • JAVA线程通信详解[通俗易懂]

    JAVA线程通信详解[通俗易懂]目录一、概述二、wait/notify机制三、Condition四、生产者/消费者模式五、线程间的通信——管道六、方法Join的使用一、概述    线程与线程之间不是相互独立的个体,它们彼此之间需要相互通信和协作,最典型的例子就是生产者-消费者问题:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列…

    2022年6月19日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号