对每对字段执行计算

时间:2013-03-20 13:32:31

标签: python perl bash awk calculated-columns

对于遗传分析,我试图将2概率文件(10gb)转换为3概率文件。基本上我必须在每两个其他实例之后插入第三列,这第三列可以计算为1-(第一个实例+第二个实例)。你会怎么做?

自:

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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