0

大きなファイルを、ファイル内の変数ごとに 1 つの情報を含む複数のファイルに分割しようとしています。

私の入力ファイルは次のようになります。

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  PID008SM

...info here 1.....

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  CL001-SC

....info here 2....

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  CL001-SC

....info here 3....        

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  PID008SM

....info here 4....

この場合、それぞれに関連する情報を含む 2 つの出力ファイル (PID008SM と CL001-SC 用に 1 つ) を作成したいと思います。

CL001-SC の出力:

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  CL001-SC

....info here 2...

....info here 3...

PID008SM の出力

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  PID008SM
....info here 1....

....info here 4....

私が使用したスクリプトは Perl ですが、どんな提案でも大歓迎です。前もって感謝します。

コード:

#!/usr/bin/perl;
use strict;
use warnings;

my $file1 = $ARGV[0] ;
my $file2 = $ARGV[1];

open (F1, $file1); #Opens first .vcf file for comparison
open (F2, $file2); #2nd for comparison

my %file;

## Create the hash key with each line of the file2
while (<F2> ) {
        #chomp;
        $file{$_}='';
}

## Print the line , if key   exist in the hash ;       

foreach my $string (<F1>) {

        if ( exists $file{$_}) and ($string =~ /(#)(.+?)(#)/s) {
                print $string;
        }
}
4

2 に答える 2

1

もしかしてこういうこと?

use strict;
use warnings;

open my $fh, '<', 'chrom.txt' or die $!;

my %fh;

while (<$fh>) {

  if ( /^#CHROM/ ) {

    my $name =  (split)[-1];

    if ($fh{$name}) {
      select $fh{$name};
      next;
    }

    my $file = "$name.txt";
    open $fh{$name}, '>', $file or die qq{Unable to open "$file" for output: $!};
    print STDOUT qq{Created file "$file"\n};
    select $fh{$name};
  }

  print;
}
于 2013-04-19T12:04:42.920 に答える
0
awk '/^#CHROM/{typ=$10;a[$0]++} a[$0]<2{print >> typ}' inputFile

この awk スクリプトは機能しているようです +

于 2013-04-19T12:03:46.400 に答える