1

遺伝分析のために、2確率ファイル(10GB)を3確率ファイルに変換しようとしています。基本的に、他の 2 つのインスタンスごとに 3 番目の列を挿入する必要があります。この 3 番目の列は、1-(最初のインスタンス + 2 番目のインスタンス) として計算できます。これをどのように行いますか?

から:

0.800   0.200   0.000   0.200   0.800   0.200
0.000   0.900   0.000   0.900   0.000   0.900
0.900   0.010   0.900   0.010   0.770   0.010

(ファイルには多くの列と行が含まれています)

0.800   0.200   0.000   0.000   0.200   0.800   0.800   0.200   0.000
0.000   0.900   0.100   0.000   0.900   0.100   0.000   0.900   0.100
0.900   0.010   0.090   0.900   0.010   0.090   0.770   0.010   0.220
4

3 に答える 3

2

awk

awk '{for(i=1;i<=NF;i+=2)$(i+1)=$(i+1)OFS sprintf("%.3f",1-$(i+1)-$i)}1' OFS='\t' file
0.800   0.200   0.000   0.000   0.200   0.800   0.800   0.200   0.000
0.000   0.900   0.100   0.000   0.900   0.100   0.000   0.900   0.100
0.900   0.010   0.090   0.900   0.010   0.090   0.770   0.010   0.220
于 2013-03-20T13:45:10.513 に答える
1
#! /usr/bin/env perl

use strict;
use warnings;

*ARGV = *DATA;  # for demo only

while (<>) {
  chomp;

  my @fields = split;
  my @output;
  while (@fields >= 2) {
    my($x,$y) = splice @fields, 0, 2;

    push @output, $x, $y, sprintf "%.3f", 1.0 - ($x + $y);
  }

  print join(" " x 3, @output, @fields), "\n";
}

__DATA__
0.800   0.200   0.000   0.200   0.800   0.200
0.000   0.900   0.000   0.900   0.000   0.900
0.900   0.010   0.900   0.010   0.770   0.010

出力:

0.800 0.200 0.000 0.000 0.200 0.800 0.800 0.200 0.000
0.000 0.900 0.100 0.000 0.900 0.100 0.000 0.900 0.100
0.900 0.010 0.090 0.900 0.010 0.090 0.770 0.010 0.220
于 2013-03-20T13:47:30.543 に答える
1
#!/usr/bin/perl
use strict; use warnings;

my $template = join "\t", ("%.3f")x3;

while (<>) {
  my @fields = split;
  @fields % 2 == 0 or die "Uneven number of fields";
  while (my ($x, $y) = splice @fields, 0, 2) {
    printf $template, $x, $y, 1 - ($x + $y);
    print  @fields ? "\t" : "\n";
  }
}

使用法: perl script.pl <input >output-file.

于 2013-03-20T13:56:14.467 に答える