-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
.
.
.

我什么也做不了,也不知道该怎么做。

非常感谢

4

3 回答 3

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
于 2013-08-07T15:17:24.033 回答
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;
于 2013-08-07T15:18:18.497 回答
1

这是一个 R 解决方案:假设您已将数据导入到 vectorinput中,

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来写这两个文件了。

于 2013-08-07T15:23:25.480 回答