【问题标题】:break each range (row) into two sub-ranges将每个范围(行)分成两个子范围
【发布时间】:2013-08-09 01:03:55
【问题描述】:

我有这样的输入:

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

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

非常感谢

【问题讨论】:

    标签: r perl awk


    【解决方案1】:

    你可以使用 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
    

    【讨论】:

      【解决方案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;
      

      【讨论】:

      • 我将您的脚本更改为划分为 5 个范围,但请指导我正确的做法吗? (我将其发布为答案)
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-28
        • 2013-11-09
        • 1970-01-01
        • 2022-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多