1

私は2つのファイルを持っています

File 1 in reading directory is of following format 

Read 1 A T
Read 3 T C
Read 5 G T
Read 7 A G
Read 10 A G
Read 12 C G

File 2 in directory contains

    Read 5 A G
    Read 6 T C
    Read 7 G A
    Read 8 G A
    Read 20 A T

File2 が含まれています

1
2
3
4
5
6
7

最初にファイル 2 の位置を読み取り、ディレクトリ内の開いているファイルから対応する値を水平方向に出力する必要があります。その位置に一致しない場合は、「-」として出力されます。上記の出力は次のようになります。

     1 2 3 4 5 6 7
Read T - C - T - G
Read - - - - G C A

すべてのファイルに対してそれを行い、上記の形式で別の行に印刷する必要があります。そのため、出力は行数がファイル数と等しい1つのファイルのみになります。これをperlで簡単に実行できますか?

4

2 に答える 2

0

私が見る限り、2 番目のデータ列のみを使用しています。これを行うための簡単な perl プログラムを次に示します。質問がある場合は、お気軽にお問い合わせください。私は 3 番目の入力ファイルを使用しましたが、ファイルはいくつでも使用できます。最後に含めるようにフォーマットを変更しまし42た。

コード:

#!/usr/bin/env perl

use strict;
use warnings;
use autodie;

# try to open format file
my $ffn = shift @ARGV or die "you didn't provide a format file name!\n";
open my $ffh, '<', $ffn;

# read format file
my @format = <$ffh>;
close $ffh;
chomp for @format; # get rid of newlines

# prepare output
print '     ' . join(' ' => @format) . "\n";

# iterate over all .txt files in the data directory
foreach my $data_fn (<data/*.txt>) {

    # iterate over all lines of the data file
    open my $data_fh, '<', $data_fn;
    my %data = ();
    foreach my $line (<$data_fh>) {

        # parse input lines (only)
        next unless $line =~ /Read (\d+) ([ACGT]) ([ACGT])/;
        my ($pos, $first, $second) = ($1, $2, $3);

        # store data
        $data{$pos} = $second;
    }

    # print summary
    print 'Read ' . join(' ' => map {$data{$_} // '-'} @format) . "\n";
}

出力:

$ perl bio.pl format.txt
     1 2 3 4 5 6 7 42
Read T - C - T - G -
Read - - - - G C A -
Read - C - T - - - A

チッ!:)

于 2012-09-07T14:50:22.130 に答える
0

ファイルのサイズが小さい場合は、それらをメモリに読み込むことができます。

#read input files
use IO::File;
my $file1_data;
open(my $file1_fh,"<","/path/file1.data") or die $!;
#read file1
while(my $line=<$file1_fh>){
  chomp($line);
  my ($read,$pos,$col1,$col2) = split(/ /,$line);
  $file1_data->{$pos} = [$col1,$col2];
}
#read file2
my $file2_data;
open(my $file2_fh,"<","/path/file2.data") or die $!;
while(my $line=<$file2_fh>){
  chomp($line);
  my ($read,$pos,$col1,$col2) = split(/ /,$line);
  $file2_data->{$pos} = [$col1,$col2];
}
#read pos file
my @positions;
while(my $pos=<$posfile_fh>){
  chomp($pos);  
  push(@positions,$pos)
}
foreach my $pos (@positions){
    print "$pos\t";
}
print "\n";
foreach my $pos (@positions){
    my $data = defined $file1_data->{$pos}->[0]?$file1_data->{$pos}->[0]:"-";
    print "$pos\t$data"
}
print "\n";
foreach my $pos (@positions){
    my $data = defined $file2_data->{$pos}->[0]?$file2_data->{$pos}->[0]:"-";
    print "$pos\t$data"
}
print "\n";
于 2012-09-07T08:11:38.540 に答える