基于类似的行标题拆分文件

时间:2014-10-11 20:50:25

标签: regex perl awk sed grep

有人可以帮我在awk,grep,sed,perl或python中编写以下要求的脚本吗?

输入文件“raw.fa”:

>CLocus_1_Sample_61_Locus_1_Allele_0 [JPKM01095229.1, 31450, +]
TGCAGGTGTGTTCTGCAGATCCAAACACAAAGAGGCAGGGATTGGAG
>CLocus_1_Sample_67_Locus_1_Allele_0 [JPKM01095229.1, 31450, +]
TGCAGGTGTGTTCTGCAGATCCAAACACAAAGAGGCAGGGATTGGAG
>CLocus_1_Sample_107_Locus_1_Allele_0 [JPKM01095229.1, 31450, +]
TGCAGGTGTGTTCTGCAGATCCAAACACAAAGAGGCAGGGATTGGAG
>CLocus_1_Sample_107_Locus_1_Allele_1 [JPKM01095229.1, 31450, +]
TGCAGGTGTGTTCTGCAGATCCAAACACAAAGAGGCAGGGGTTGAAG
>CLocus_41_Sample_158_Locus_53_Allele_0 [JPKM01105094.1, 1700, +]
TGCAGGTTATCCAGCTCTATTCTGCACTGGCCATCGTACCAAATAGCAGGAGGGT
>CLocus_41_Sample_159_Locus_31_Allele_0 [JPKM01105094.1, 1700, +]
TGCAGGTTATCCAGCTCTATTCTGCACTGGCCATCGTACCAAATAGCAGGAGGGT
>CLocus_86_Sample_161_Locus_103_Allele_0 [JPKM01106288.1, 770, -]
TGCAGGGAACCGTGCTCAGCTCTGGAGTATTCCCACACACTTGGCTCCCATTGGGATGACTCCTTT
>CLocus_86_Sample_164_Locus_98_Allele_0 [JPKM01106288.1, 770, -]
TGCAGGGAACCGTGCTCAGCTCTGGAGTATTCCCACACACTTGGCTCCCATTGGGATGACTCCTTT
>CLocus_86_Sample_166_Locus_110_Allele_0 [JPKM01106288.1, 770, -]
TGCAGGGAACCGTGCTCAGCTCTGGAGTATTCCCACTCACTTGGCTCCCATTGGGATGACTCCTTT
>CLocus_86_Sample_167_Locus_123_Allele_0 [JPKM01106288.1, 770, -]
TGCAGGGAACCGTGCTCAGCTCTGGAGTATTCCCACTCACTTGGCTCCCATTGGGATGACTCCTTT

我想用locus分割上面的文件,每个基因座有1个文件,保留第一行的DNA(第二行)和样本#,产生三个单独的.fa文件:

“locus1.fa”:

>Sample_61
TGCAGGTGTGTTCTGCAGATCCAAACACAAAGAGGCAGGGATTGGAG
>Sample_67
TGCAGGTGTGTTCTGCAGATCCAAACACAAAGAGGCAGGGATTGGAG
>Sample_107
TGCAGGTGTGTTCTGCAGATCCAAACACAAAGAGGCAGGGATTGGAG
>Sample_107
TGCAGGTGTGTTCTGCAGATCCAAACACAAAGAGGCAGGGGTTGAAG

“locus41.fa”:

>Sample_158
TGCAGGTTATCCAGCTCTATTCTGCACTGGCCATCGTACCAAATAGCAGGAGGGT
>Sample_159
TGCAGGTTATCCAGCTCTATTCTGCACTGGCCATCGTACCAAATAGCAGGAGGGT

“locus86.fa”:

>Sample_161
TGCAGGGAACCGTGCTCAGCTCTGGAGTATTCCCACACACTTGGCTCCCATTGGGATGACTCCTTT
>Sample_164
TGCAGGGAACCGTGCTCAGCTCTGGAGTATTCCCACACACTTGGCTCCCATTGGGATGACTCCTTT
>Sample_166
TGCAGGGAACCGTGCTCAGCTCTGGAGTATTCCCACTCACTTGGCTCCCATTGGGATGACTCCTTT
>Sample_167
TGCAGGGAACCGTGCTCAGCTCTGGAGTATTCCCACTCACTTGGCTCCCATTGGGATGACTCCTTT

感谢您的帮助!我发现awk代码首先出现分裂,但不是如何分割相似行的分组(例如所有带有locus86标题的行和它们的第二行DNA序列)。

-Chris Martin

2 个答案:

答案 0 :(得分:2)

如果你有一小部分" locus"价值观,你可以为他们寻找:

grep -A 1 locus86 raw.fa > locus86.tmp

然后重新格式化该行:

sed 's/>.*(Sample .*)_Locus_.*/\1/' locus86.tmp > locus86.fa

(显然你可以将它们与管道结合使用而不是使用中间文件)。

如果您有一组更大或未知的基因座值,那么像perl这样的脚本编写是有意义的。需要注意的是,打开/关闭文件可能会很昂贵,这里有一些伪代码:

open(IN, "raw.fa");
my $OUT = undef;
while (<IN>) {
    if (/>/) {
        my ($sample, $locus) = ($_ ~= /.*\(Sample_.*\)_\(Locus_.*\)_Allele/);
        if (defined($OUT)) {
          close($OUT);
        }
        open($OUT, "$locus.fa");
        print $OUT ">$sample\n";
    }
    else {
        print $OUT $_;
    }
}

答案 1 :(得分:0)

#!/usr/bin/perl
$file = shift;
my $locusfile;  
open FILE, $file; 
while(<FILE>) 
{
  chomp($_);
  if (/CLocus_([0-9]*)_Sample_([0-9]*)_.*/)
  {
    $locusfile="locus" . $1 . ".fa";
    $cmd = qq{echo ">Sample_$2" >> $locusfile}; 
  }
  else
  {
    $cmd = qq{echo "$_" >> $locusfile};
  }
    system($cmd); 
}
close(FILE);

我无法追加&#34;&gt;&#34;在行尾开始的字符 - 在插入system命令时遇到很多问题...所以它不是一个完整的答案,但它可以做你想要的。

[固定]

干杯