2013-08-07 85 views
-2

我有一個這樣的輸入:打破每個範圍(行)成兩個子範圍

120-160 

200-220 

400-500 
. 
. 
. 

我將連接打破每個範圍(行)分爲兩個子範圍:

120-140 141-160 

200-210 211-220 

400-450 451-500 
. 
. 
. 

然後將每列(範圍)打印到不同的文件中。

文件1:

120-140 

200-210 

400-450 
. 
. 
. 

文件2:

141-160 

211-220 

451-500 
. 
. 
. 

我不能做任何事情,不知道該怎麼做。

非常感謝您

回答

2

Perl的解決方案。另存爲break-range.pl,以perl break-range.pl input運行。

#!/usr/bin/perl 
use warnings; 
use strict; 

open my $F1, '>', 'file1' or die $!; 
open my $F2, '>', 'file2' or die $!; 

while (<>) { 
    chomp; 
    if (my ($low, $high) = /([0-9]+)-([0-9]+)/) { 
     my $middle = int(($low + $high)/2); 
     print $F1 "$low-$middle\n"; 
     print $F2 $middle + 1, "-$high\n"; 
    } 
} 
close $F1; 
close $F2; 

對於輸出文件的非固定號碼,您可以使用類似下面,運行它break-rangle.pl number-of-files input。請注意,如果文件數大於間隔的大小,它可能不起作用。

#!/usr/bin/perl 
use warnings; 
use strict; 

my $number = shift; 

my @FH; 
for my $i (0 .. $number - 1) { 
    open $FH[$i], '>', "file$i" or die $!; 
} 

while (<>) { 
    chomp; 
    if (my ($low, $high) = /([0-9]+)-([0-9]+)/) { 
     my $step = ($high - $low)/$number; 
     for my $i (0 .. $number - 1) { 
      print {$FH[$i]} int($low + $i * $step) + ($i > 0), '-', 
          int($low + ($i + 1) * $step), "\n"; 
     } 
    } 
} 
close $_ for @FH; 
+0

我改變了你的腳本分爲5個範圍,但請引導我這樣做的正確方法? (我發佈它作爲答案) – EpiMan

+0

@MaryamSani:查看更新。 – choroba

+0

非常感謝。很有幫助 – EpiMan

4

你可以使用bash:

while IFS=- read min max; do 
    mid=$(((min+max)/2)) 
    printf "%d-%d\n" $min $mid >> file.1 
    printf "%d-%d\n" $((mid+1)) $max >> file.2 
done < input.file 

awk的是

awk -F- -v OFS=- '{ 
    mid = int(($1+$2)/2) 
    print $1, mid > "file.1" 
    print mid+1, $2 > "file.2" 
}' input.file 
1

這裏爲R解決方案:假設你已經導入的數據轉換成矢量input

input <- c("120-160", "200-220", "400-500") 
ranges <- strsplit(input, "-") 
ranges <- lapply(ranges, as.numeric) 
ranges <- lapply(ranges, function(x) c(x[1], mean(x), x[2])) 

output1 <- sapply(ranges, function(x) sprintf("%d-%d", x[1], x[2])) 
output2 <- sapply(ranges, function(x) sprintf("%d-%d", x[2]+1, x[3])) 

然後可以使用writeLines寫的兩個文件。