2013-08-07 54 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写的两个文件。