注释文件通常按照染色体序号升序排列,而有时需要我们对获取的注释文件进行排序。对于chr01这种直接sort就可以,但是对于chr1, chr2… chr11这种,直接sort的结果是chr11排在chr2前面。解决这种情况的方法很简单,提取染色体中的数字,然后使用sort的-n参数就可以。而写成脚本复用起来也比较方便。
有些物种染色体命名可能特殊,所以line 24的正则匹配要针对不同情况修改。现在的脚本匹配染色体命名为Chr chr CHR。
#!/usr/bin/perl
# 2020-11-12
# sort bed or gff file
my $usage="Usage: $0 <file.bed or file.gff3>\n";
my $input;
my $tmp="./sortBedGFF_tmp01";
if(@ARGV==1){
$input=shift @ARGV;
}
else{
die "$usage\n";
}
open INPUT,$input or die "fileOpenError: unable to open $input\n";
open TMP,">".$tmp;
while(<INPUT>){
chomp;
my $line=$_;
my @line=split "\t",$line;
my $chr=$line[0];
my $mod_chr;
if($chr=~/[cC][hH][rR](\d+)/){
$mod_chr=$1;
}
else{
$mod_chr=$chr;
print STDERR "error in line $.: chromosome name ($chr) not match regular expression, you may change $0 in line 24\n"
}
print TMP "$mod_chr\t$line\n";
}
close INPUT;
close TMP;
my $outfile=$input;
if($input=~/bed/){
$outfile=~s/bed/sorted.bed/g;
system("sort -k 1n,1 -k 3n,4n $tmp | sed 's/^[0-9]*\t//g' > $outfile");
}
elsif($input=~/gff/){
$outfile=~s/gff.*/sorted.gff/g;
system("sort -k 1n,1 -k 5n,6n $tmp | sed 's/^[0-9]*\t//g' > $outfile");
}
unlink $tmp; #remove temporary file
print STDERR "Finished\n";