2

私はこの出力データを持っています:

10dvex1_miRNA_ce.out.data|3331
10dvex1_misc_RNA_ce.out.data|0
10dvex1_rRNA_ce.out.data|60
10dvex1_snoRNA_ce.out.data|895
10dvex1_snRNA_ce.out.data|2127
11dvex1_miRNA_ce.out.data|3367
11dvex1_misc_RNA_ce.out.data|0
11dvex1_rRNA_ce.out.data|54
11dvex1_snoRNA_ce.out.data|839
11dvex1_snRNA_ce.out.data|1770
12dvex1_miRNA_ce.out.data|3321
12dvex1_misc_RNA_ce.out.data|0
12dvex1_rRNA_ce.out.data|50
12dvex1_snoRNA_ce.out.data|854
12dvex1_snRNA_ce.out.data|1821

この出力を表のようにこの形式に変換したい:

`Fragment \t miRNA \t misc_RNA \t rRNA \t snRNA \t snoRNA`
 10 \t 3331 \t 0 \t 60 \t 2127 \ 895 \n
 11 \t 3367 \t 0 \t 54 \t 1770 \t 839 \n
 12 \t 3321 \t 0 \t 50 \t 1821 \t 854 \n

このテーブルを R への入力として使用する必要があります。このスクリプトで perl を試してみましたが、結果は良くありません:

#!/usr/bin/perl

use warnings;
use strict;

open(MYINPUTFILE, $ARGV[0]); # open for input
my @lines = <MYINPUTFILE>; # read file into list
print "Frag"."\t"."miRNA"."\t"."misc_RNA"."\t"."rRNA"."\t"."snRNA"."\t"."snoRNA"."\n";
foreach my $lines (@lines){
    my $pattern = $lines;
    $pattern =~ s/(.*)dvex\d_(.*)_(.*)\|(.*)/$1 $2  $4/g;
    print $1."\t".$4;
}
close(MYINPUTFILE);
exit;

そして結果:

Frag    miRNA   misc_RNA    rRNA    snRNA   snoRNA
10  333110  010 6010    89510   212711  336711  011 5411    83911   177012  332112  012 5012

アイデアじゃないですか。

4

5 に答える 5

1

printステートメントにキャリッジリターンが欠落しているようです。例えば、

print $1."\t".$4."\n";
于 2012-11-01T04:44:53.047 に答える
1

このコードは機能します。フラグメント番号が変更されるとラップされます。データの順序は常にヘッダーの順序に対応していると想定しています。

open(MYINPUTFILE, $ARGV[0]); # open for input
my @lines = <MYINPUTFILE>; # read file into list
print "Frag"."\t"."miRNA"."\t"."misc_RNA"."\t"."rRNA"."\t"."snRNA"."\t"."snoRNA";
my $frag = '';
foreach my $line (@lines){
    if ( $line =~ /^(\d+)dvex.*\|(\d+)/ ) {
        my $fr = $1;
        if ( $fr ne $frag ) {
            print "\n$fr";
            $frag = $fr;
        }
        print "\t".$2;
    }
}
print "\n";
close(MYINPUTFILE);
exit;

出力は次のようになります。

Frag    miRNA   misc_RNA        rRNA    snRNA   snoRNA
10      3331    0       60      895     2127
11      3367    0       54      839     1770
12      3321    0       50      854     1821
于 2012-11-01T05:08:12.600 に答える
1

このようなもの:

print $1."\t".$4;
print "\n" if ($2 eq "snRNA");

パターン「snRNA」を取得するたびに線を引きます。

于 2012-11-01T05:03:06.500 に答える
0

OPの要求に応じて列を並べ替える別のオプションを次に示します。

use strict;
use warnings;

my %hash;
my @header = qw (Frag miRNA misc_RNA rRNA snRNA snoRNA);

/(\d+).+?_(.+)_ce.+\|(.+)/ and $hash{$1}{$2} = $3 for <>;

print +( join "\t", @header ) . "\n";

for my $key ( sort { $a <=> $b } keys %hash ) {
    my @line;
    push @line, $hash{$key}{ $header[$_] } for 1 .. $#header;
    print +( join "\t", $key, @line ) . "\n";
}

出力:

Frag    miRNA   misc_RNA    rRNA    snRNA   snoRNA
10  3331    0   60  2127    895
11  3367    0   54  1770    839
12  3321    0   50  1821    854
于 2012-11-01T06:12:27.227 に答える
0

これは、ファイルの順序に関係なく、データからヘッダーを抽出します。戦略は、データを構造体に蓄積し、すべてのデータが検査された後に一度にすべてを出力することです。本当に(本当に)大きなファイルがある場合、メモリを食い尽くす可能性があります。

open(MYINPUTFILE, $ARGV[0]); # open for input
my @lines = <MYINPUTFILE>; # read file into list
close(MYINPUTFILE);

## parse the data
my $types_found = {};
my $data = {};
foreach my $line (@lines){
    if ( $line =~ /^(\d+)dvex\d+_(.+)_ce\.out\.data\|(\d+)/ ) {
        $types_found->{$2} = '';
        $data->{$1}{$2} = $3;
    }
}

## print the header
my @types = sort keys %$types_found;
print "Frag";
foreach my $type ( @types ) {
    print "\t" . $type;
}
print "\n";

## print the rows
foreach my $frag ( sort keys %$data ) {
    print $frag;
    foreach my $type ( @types ) {
        print "\t" . $data->{$frag}{$type};
    }
    print "\n";
}

出力:

Frag    miRNA   misc_RNA        rRNA    snRNA   snoRNA
10      3331    0       60      2127    895
11      3367    0       54      1770    839
12      3321    0       50      1821    854
于 2012-11-01T05:35:03.740 に答える