按照文件要求合并同一样本的多个fastq文件至目标目录。更多知识分享请到 https://zouhua.top/

脚本

  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use Getopt::Long;
  5. use Cwd 'abs_path';
  6. my ($file, $fq_dir, $out, $help, $version);
  7. GetOptions(
  8. "f|file:s" => \$file,
  9. "d|fq_dir:s" => \$fq_dir,
  10. "o|out:s" => \$out,
  11. "h|help:s" => \$help,
  12. "v|version" => \$version
  13. );
  14. &usage if(!defined $out);
  15. my $cwd = abs_path;
  16. # output
  17. system "mkdir -p $out" unless(-d $out);
  18. my %sampleid;
  19. open(IN, "$file") or die "can't open $file\n";
  20. <IN>;
  21. while(<IN>){
  22. chomp;
  23. my @array = split("\t", $_);
  24. $sampleid{$array[0]} = 1;
  25. }
  26. close(IN);
  27. my (%read1, %read2);
  28. opendir(DIR, $fq_dir) or die "can't open $fq_dir";
  29. foreach (sort grep(/gz$/, readdir(DIR))){
  30. my $samplename = $1 if $_ =~ m/(\S+)\_(S\d+)\_L/; # N47_S181_L001_R1_001.fastq.gz
  31. if(exists($sampleid{$samplename})){
  32. my $read_mode = $1 if $_ =~ m/\_(R\d)\_(\d+)\.fastq.gz/; # N47_S181_L001_R1_001.fastq.gz
  33. if($read_mode eq "R1"){
  34. my $sample_key = join("_", $samplename, "R1");
  35. my $fq1 = join("/", $fq_dir, $_);
  36. push(@{$read1{$sample_key}}, $fq1);
  37. }elsif($read_mode eq "R2"){
  38. my $sample_key = join("_", $samplename, "R2");
  39. my $fq2 = join("/", $fq_dir, $_);
  40. push(@{$read2{$sample_key}}, $fq2);
  41. }
  42. }
  43. }
  44. closedir(DIR);
  45. my $out_dir = join("/", $cwd, $out);
  46. foreach my $key_r1 (keys %read1){
  47. my $fq_r1 = join(" ", @{$read1{$key_r1}});
  48. my $length = scalar(@{$read1{$key_r1}});
  49. my $target = "$out_dir/$key_r1\.fastq.gz";
  50. unless(-e $target){
  51. my $shell = "cat $fq_r1 > $target";
  52. system("$shell");
  53. print("$key_r1 ($length fastq) successfully combined\n");
  54. }
  55. }
  56. foreach my $key_r2 (keys %read2){
  57. my $fq_r2 = join(" ", @{$read2{$key_r2}});
  58. my $length2 = scalar(@{$read2{$key_r2}});
  59. my $target2 = "$out_dir/$key_r2\.fastq.gz";
  60. unless(-e $target2){
  61. my $shell2 = "cat $fq_r2 > $target2";
  62. system("$shell2");
  63. print("$key_r2 ($length2 fastq) successfully combined\n");
  64. }
  65. }
  66. sub usage{
  67. print <<USAGE;
  68. usage:
  69. perl $0 -f <file> -d <fq_dir> -o <out>
  70. options:
  71. -f|file :[essential].
  72. -d|dir :[essential].
  73. -o|out :[essential].
  74. USAGE
  75. exit;
  76. };
  77. sub version {
  78. print <<VERSION;
  79. version: v1.0
  80. update: 20201228 - 20201228
  81. author: zouhua1\@outlook.com
  82. VERSION

运行

  1. perl combine_fq.pl -f phenotype.tsv -d /data_backup/rawdata/-o RawData_rename > combine.log