对于遗传分析,我试图将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
答案 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
。