Linux脚本丨批量提取VCF文件指定样本数据

简介: Linux脚本丨批量提取VCF文件指定样本数据

今天分享一个实用的数据提取思路:从VCF文件中提取指定列,比如有1000个样本,需要从中提取出200个指定样本,形成新的vcf文件。需要在Linux环境下进行操作,主要用到perl脚本和shell脚本。

原始数据

  1. 原始文件vcf :开始为若干行注释信息以##开头,然后是表头信息由#开始(该行包括样本ID)
  2. 待提取的样本ID:txt文件,每个样本ID一行(list.txt)

什么是VCF文件?

伴随着大规模的基因分型及测序数据的产生,迫切需要一种新的格式来记录高效的记录这些变异信息。VCF(Variant Call Format)就是这样一种用来贮存基因序列变异信息的文本文件。

VCF 格式文件信息:

  1. header section:元信息(meta-information),以‘##’为前缀,通常包含fileformat、fileDate、reference等信息。头行信息( header line ),以‘#’为前缀
  2. data section:该部分为主题部分,记录了每个样品每个位点处的基因分型信息。可以看作是一个大的Excel表格,每行是一个位点,每列是一个样本。

创建一个工作文件夹work,将第一个文件放在其data子文件夹下,第二个文件放在工作文件夹work中。

一般每个染色体有一个VCF文件,压缩为xxx.vcf.gz,将全部压缩包保存到一个目录data下。

操作步骤

批量解压缩

在data文件夹中,输入gunzip *.vcf.gz解压所有文件,获得很多个VCF文件

保存注释信息

由于VCF文件刚开始几十行为注释信息(假设为78行),可以先把注释信息截取出来单独存放为一个zhushi.vcf,然后再对剩下的数据矩阵进行转置筛选,最后将注释信息加上。

head -n 78 ./data/xxx.vcf > zhushi.vcf

转置VCF文件

由于VCF文件的每一列为一个样本,为了进行筛选,先将其转置,变为每行一个样本的格式,使用如下perl脚本(s1.pl):

#! /usr/bin/perl -w
use strict;
die "perl $0 \n" unless @ARGV==1;
my $lst=shift;
open IN,$lst;
my (@a,@b);
my $len;
my $max=0;
while(<IN>){
        chomp;
next if /^##/;  
# 上面这行代码表示以##开头的行被忽略
        @b=split/\t/,$_;
        $len=@b;
        $max=$max > $len ? $max:$len;
        push @a,[@b];
}
close IN;
for my $i(0..$max-1){
        for(@a){
                @$_[$i]||="";
                print "@$_[$i]\t";
        }
        print "\n";
        #换行显示
}

执行脚本:

perl s1.pl ./data/xxx.vcf > ./data/xxx.vcf_1

筛选指定样本

转置之后的vcf_1文件每一行是一个样本,根据所需的样本待提取编号进行提取,提取所用到的perl脚本(s2.pl)如下:

#! /usr/bin/perl -w
use strict;
open IN1,"$ARGV[0]" or die;
open IN2,"$ARGV[1]" or die;
open OUT,">$ARGV[2]" or die;
#需要三个参数,需要提取的样本ID编号序列信息、待提取的原始文件名、提取后新生成的文件名
my %hash;
while(<IN1>){
chomp;
my @a=split/\s/,$_;
$hash{$a[0]}=1;
}
close IN1;
while(<IN2>){
chomp;
print OUT $_,"\n" if /^#/; 
print OUT $_,"\n" if /POS/;
print OUT $_,"\n" if /ID/;
print OUT $_,"\n" if /REF/;
print OUT $_,"\n" if /ALT/;
print OUT $_,"\n" if /QUAL/;
print OUT $_,"\n" if /FILTER/;
print OUT $_,"\n" if /INFO/;
print OUT $_,"\n" if /FORMAT/;
#如果改行一以上述关键字出现,则全部保留,因为这些是文件的有用信息
my @b=split/\s/,$_;
if(exists $hash{$b[0]}){print OUT join("\t",@b),"\n"}
else{next}
}
close IN2;close OUT;

执行脚本:

perl s2.pl list.txt ./data/xxx.vcf_1 ./data/xxx.vcf_2

重新转置数据

筛选完成后,需要对数据进行转置,还原为之前的数据格式,直接调用s1.pl即可完成。

perl s1.pl ./data/xxx.vcf_2 > ./data/xxx.vcf_3

转置后需要将刚开始提取的表头注释信息再添加上去,用cat命令将两个文件合并到一起。

cat zhushi.vcf ./data/xxx.vcf_3 > ./data/xxx.vcf_4

如上得到的vcf_4文件就是筛选得出的最终结果,对其改名,然后使用gzip压缩为原来的压缩包格式。流程结束!

mv ./data/*.vcf_4 `sed 's/.vcf_4/.vcf/g'`
gzip *.vcf

批量进行操作

以下内容为bash脚本,用于批量处理多个vcf文件。

批量解压、转置、提取

#!/bin/bash
gunzip ./data/*.gz
for i in $(ls ./data/*.vcf)
do
 echo $i
 perl s1.pl $i > ${i}_1
 perl s2.pl list.txt ${i}_1 ${i}_2
 perl s1.pl ${i}_2 > ${i}_3
 cat zhushi.vcf ./data/xxx.vcf_3 > ./data/xxx.vcf_4
 echo "ok"
done

批量改文件名

#!/bin/bash
for i in `ls ./data/*.vcf_4`;do
 echo $i | mv $i `sed 's/.vcf_4/.vcf/g'`
 echo ${i}ok
done

END

© 素材来源于网络,侵权请联系后台删除

往期推荐:

文献丨群体转录组分析锁定关键转录因子

文献丨转录组RNA seq——青年阶段!

笔记丨ggplot2热图入门学习笔记

笔记丨PCA分析基本知识和数学原理

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
28天前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
1月前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
73 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
24天前
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
183 14
|
23天前
|
存储 NoSQL Linux
linux积累-core文件是干啥的
核心文件是Linux系统在程序崩溃时生成的重要调试文件,通过分析核心文件,开发者可以找到程序崩溃的原因并进行调试和修复。本文详细介绍了核心文件的生成、配置、查看和分析方法
81 6
|
25天前
|
存储 NoSQL Linux
linux之core文件如何查看和调试
通过设置和生成 core 文件,可以在程序崩溃时获取详细的调试信息。结合 GDB 等调试工具,可以深入分析 core 文件,找到程序崩溃的具体原因,并进行相应的修复。掌握这些调试技巧,对于提高程序的稳定性和可靠性具有重要意义。
200 6
|
2月前
|
Linux 开发工具 Perl
在Linux中,有一个文件,如何删除包含“www“字样的字符?
在Linux中,如果你想删除一个文件中包含特定字样(如“www”)的所有字符或行,你可以使用多种文本处理工具来实现。以下是一些常见的方法:
48 5
|
2月前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
61 6
|
2月前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
213 6
|
2月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
235 8

热门文章

最新文章