首页 > 解决方案 > 如何从特定行收集字符串

问题描述

我正在使用其他人的 Perl 代码,并且想从第 2 行而不是第 1 行中提取字符串。

以下格式的 4 行重复构成要处理的文件:

@HWI-M02096:147:000000000-AFU9U:1:1101:15747:1825 1:N:0:CGTACTAGCTCTCT
CTACAGCAGAGAGTGTTTAGGAAGCACCTTTTCGTTAGGCAGATTT
+
3>AAAFFFFC?FGFGGGGGGGGHHHHHHHHHHHGHHGGHHBEFHHH

我的理解是 substr 偏移了 $barcodeLen 并记录了第 1 行给出的 $UMIlen 长度的字符串。这被写入一个文件,输出第 1 行在“1825”和“1:N:0”之间的空格处拆分,后跟记录的字符串 例如:@HWI-M02096:147:000000000-AFU9U:1:1101:15747:1825 TCTCT

my $seqdir = $ARGV[0];
my $barcodeLen = $ARGV[1];
my $UMIlen = $ARGV[2];
my @seqfiles = <$seqdir/*>;
foreach my $file (sort@seqfiles) {
       getUmi($file);
}

sub getUmi 
{
    my $seqfile = shift;
    open(INFILE, "$seqfile") || die("Cannot open file $seqfile  $!\n");
    my @temp = split(/\//,$seqfile);    
    my $outfile = $temp[length(@temp)];
    my $outfile1 = "UMI-" . $outfile;
    my ($line, @line, $umi, $firstbps, $seqlen);
    open(OUTFILE1, ">$outfile1") || die("Cannot open file $outfile1 
$!\n");
    my $i =0;
    while (<INFILE>)
    {
        $line = $_;
        chomp $line;
        $i++;
        if ($i % 4 ==1)
        {
              @line = split(" ", $line);    
              @temp = $line[1];
              ### extract umi
              $umi = substr($temp[scalar @temp - 1],$barcodeLen, 
$UMIlen);
              print OUTFILE1 "$line[0]\t$umi\n";
        }
    }
    close(INFILE);
    close(OUTFILE1);
}

我无法理解 @temp 数组和 $line 变量如何用于生成示例输出。我想生成相同类型的输出,而是从第 1 行“@HWI-M02096:14 ...”收集标题信息,但从第 2 行收集一个字符串。任何帮助将不胜感激。

标签: perlsplitsubstr

解决方案


推荐阅读