多线程拆分bam文件

#!perl
use warnings;
#use strict;
use threads;
use Thread::Semaphore;
use File::Basename qw(basename);

die "perl $0 <bam> <threads>\n" if @ARGV != 2;

my $semaphore = Thread::Semaphore->new($ARGV[1]);
my $id = basename($ARGV[0], ".bam");
if(-s "$ARGV[0].bai")
{

}else{
	`samtools index $ARGV[0]`;
}
my $outdir = "${id}_split";
mkdir $outdir;

my (%hash, $hd, $rg, $pg);
open HEAD, "samtools view -H $ARGV[0] |" or die $!;
while(<HEAD>)
{
	if(/^\@SQ/)
	{
		my ($chr) = $_ =~ /SN:(\S+)/;
		$hash{$chr} = $_;
		next;
	}
	if(/^\@HD/)
	{
		$hd .= "$_";
		next;
	}
	if(/^\@RG/)
	{
		$rg .= "$_";
		next;
	}
	if(/^\@PG/)
	{
		$pg .= "$_";
		next;
	}
}

foreach(keys %hash)
{
	$semaphore->down();
	my $thread = threads->create(\&splitchr, $_);
	$thread->detach();
}

&waitDone;

sub waitDone{
	my $num = 0;
	while($num < $ARGV[1])
	{
		$semaphore->down();
		$num ++;
	}
}

sub splitchr{
	my $chr = shift;
	open $chr, "> $outdir/$id.$chr.sam" or die $!;
	print $chr "$hd$hash{$chr}$rg$pg";
	my $content = `samtools view $ARGV[0] $chr`;
	print $chr "$content";
	close $chr;
	`samtools view -bS $outdir/$id.$chr.sam > $outdir/$id.$chr.bam`;
	`rm $outdir/$id.$chr.sam -rf`;
}

仅仅适合内存较大的集群~

时间: 2024-08-27 07:59:05

多线程拆分bam文件的相关文章

split、rar拆分大文件

split拆分大文件 系统默认自带有 # split -b 2048m aa aa_ -b n[bkm]  b代表512b,k代表1KB,m代表1M 后面aa表示指定文件前缀 结果为:aa_aa aa_ab 合并拆分文件: # cat aa_aa aa_ab > aa rar拆分大文件 # apt-get install rar # rar a -v2048m aa.rar aa 结果为:aa.part1.rar aa.part2.rar 合并并解压: # unrar aa.part1.rar

python多线程读取同一个文件

多线程读取同一个文件,要求不能重复,不能遗漏. 最开始尝试了一种方法(后来实践证明是无效的) 主线程分配给每个读线程需要读取文件中哪些行, 比如线程1读取1-10行,线程2读取11-30行. 然后每个线程通过readline()来读取,读到的行如果不属于本线程的范围,则continue跳过. 实践证明,这若干个线程并没有按照我们期望来读. 我的猜想是,通过open来打开一个文件,多个线程返回的是同一个句柄, 或者一个文件的文件指针只有一个. 经过网上搜索和实践,总结出有以下方法支持多线程读取同一

SAM/BAM文件处理

当测序得到的fastq文件map到基因组之后,我们通常会得到一个sam或者bam为扩展名的文件.SAM的全称是sequence alignment/map format.而BAM就是SAM的二进制文件(B取自binary). 那么SAM文件的格式是什么样子的呢?如果你想真实地了解SAM文件,可以查看它的说明文档.SAM由头文件和map结果组成.头文件由一行行以@起始的注释构成.而map结果是类似下面的东西: HWI-ST1001:137:C12FPACXX:7:1115:14131:66670

拆分大文件的脚本

有时候需要把一个大文件拆分成几个小文件,由于生产系统上没有split程序,因此自己写了两个脚本来实现该功能. 第一个脚本根据行数来拆分: #! /bin/bash #filename my-line-split.sh #usage: my-line-split.sh 行数 bigfile #拆分的文件以bigfile.split.1 bigfile.split.2...命名 split_line=$1 file=$2 total_line=$(wc -l <$file) prefix=$file

如何拆分PDF文件、PDF在线图文拆分教程!

如果在工作中碰到的PDF文件内容过多不方便查阅的话怎么办?最好的方法就是将文件拆分成多个文件,分开进行查看,但是怎么拆分PDF文件呢?下面小编就为大家详细的介绍一下! 1.首先需要下载软件在电脑上,在网上搜索迅捷pdf编辑器的下载资源,找到后就可以进行下载了,下载完成后就可以将软件自定义安装在电脑上了. 2.接着打开软件,点击打开页面左上角"打开"按钮,这样就可以在新弹出的窗口上将需要进行拆分的pdf文件添加进来了. 3.文件添加完成后点击界面工具栏上的"文档"按钮

多线程读取大文件,尤其是对日志文件分析很有用。

我在之前的公司里工作的时候,他们要求我做一个能够分析IIS日志的程序,可我做来做去,也只能做到,1个G的文件读取在140秒左右.愁了很久,想到了用多线程读取大文件的方法,又发现文件读取流可以有很多个,于是我就开始编写,写出来,其效率 4核CPU,可以达到14秒,提高了10倍. 而且据我测试发现,我4个CPU,用8个线程读取效率最高,所以我想会不会是一个CPU挂2个文件流效率最高,故基本逻辑是这样的,我根据CPU核数,将文件分成8块,分成8块的时候,必定出现,一行被截断的情况,针对这种情况,我采用

C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题

在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三方日志插件,也可以选择使用数据库,还可以自己写个简单的方法把错误信息记录到日志文件. 选择最后一种方法实现的时候,若对文件操作与线程同步不熟悉,问题就有可能出现了,因为同一个文件并不允许多个线程同时写入,否则会提示“文件正在由另一进程使用,因此该进程无法访问此文件”. 这是文件的并发写入问题,就需要用到线程同步.而微软也给进程同步提供了一些相关的类可以达到这样的目的,本文使用到的 System.Threadin

java多线程写入同一文件

package com.thread;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.concurrent.ConcurrentLinkedQueue; * 多线程下写文件 * @author owen.huang * 将要写入文件的数据存入队列中class Creater imp

java多线程批量读取文件(七)

新公司入职一个多月了,至今没有事情可以做,十来个新同事都一样抓狂,所以大家都自己学习一些新东西,我最近在看zookeeper,感觉蛮不错的,和微服务的zuul以及eureka功能类似,只是代码复杂了一些.而今天,我所要说的是java多线程读取文件的两个例子: 例子1:java多线程批量读取文件 package face.thread.ReadFile; /** * 多线程读.写文件 *  */import java.io.BufferedReader;import java.io.Buffere