私はperlがこれを行うことができると思いますが、私はperlにかなり慣れていません。
誰かが私を助けてくれることを願っています。私はこのようなファイルを持っています(実際のファイルは1万行以上で、値は昇順で、一部の値は重複しています)。
1
2
2
35
45
値の類似性に基づいて、これらの行を別々のファイルに分割したいと思います(たとえば、値の差が30未満)。
outfile1
1
2
2
outfile2
35
45
ありがとう
私はperlがこれを行うことができると思いますが、私はperlにかなり慣れていません。
誰かが私を助けてくれることを願っています。私はこのようなファイルを持っています(実際のファイルは1万行以上で、値は昇順で、一部の値は重複しています)。
1
2
2
35
45
値の類似性に基づいて、これらの行を別々のファイルに分割したいと思います(たとえば、値の差が30未満)。
outfile1
1
2
2
outfile2
35
45
ありがとう
これは、必要なたびに、つまりデータの最初の行とその後 30 以上のギャップがあるたびに、新しいファイルを開くだけで非常に簡単に実行できます。
このプログラムは、コマンド ラインのパラメータとして入力ファイルの名前を想定しています。
use strict;
use warnings;
use autodie;
my ($last, $fileno, $fh);
while (<>) {
my ($this) = /(\d+)/;
unless (defined $last and $this < $last + 30) {
open $fh, '>', 'outfile'.++$fileno;
}
print $fh $_;
$last = $this;
}
それは本当に簡単なはずです。差が十分に大きいかどうかを確認できるように、変数の前の値を覚えておいてください。また、必要に応じて新しいファイルに名前を付けることができるように、これまでに作成された出力ファイルをカウントする必要があります。
#!/usr/bin/perl
use warnings;
use strict;
my $threshold = 30;
my $previous;
my $count_out = 0;
my $OUTPUT;
while (<>) {
if (not defined $previous or $_ > $previous + $threshold) {
open $OUTPUT, '>', "outfile" . $count_out++ or die $!;
}
print $OUTPUT $_;
$previous = $_;
}