【发布时间】:2012-03-02 11:06:43
【问题描述】:
如果值连续超过 4 行(如果 col1 中的值相同),我想提取行,但应该打印所有行(应该打印超过 4 行)。
如果 col1 中的值相等,并且 col2 和 col3 中的值连续(如连续数字)超过接下来的 4 行,则返回这些行。行 col3 中的值可以相等,也可以小于下一行 col2 值的 100。
这里连续并不意味着 1 行(即 1 行 col3 - col2)。这意味着与下一行的 col2 值相比,行的 col3 值。
我的文件是 ->
一个 0 100 A1 0 100 A1 100 200 A1 200 300 A1 400 500 A1 500 600 A1 600 700 A1 700 800 A1 1600 1700 A2 100 200 A2 200 300 A2 400 500 A2 500 600 A2 600 700 A3 800 900想要的输出是->
A1 0 100 A1 100 200 A1 200 300 A1 400 500 A1 500 600 A1 600 700 A1 700 800 A2 100 200 A2 200 300 A2 400 500 A2 500 600 A2 600 700这里还有 1 个示例 -> 我的输入文件->
一个 0 100 A1 0 100 A1 100 200 A1 200 300 A1 500 600 A1 600 700 A1 700 800 A1 1600 1700 A2 100 200 A2 200 300 A2 400 500 A3 800 900输出->
“没有连续的行”。
现在没有输出,因为应该有超过 4 行具有相同的 col1 值,并且这些行的 col3 值应该等于或小于 100,与下一行相比。
到目前为止,我尝试了这个但没有用 ->
use strict;
use warnings;
*ARGV or die "No input file specified";
open *first, '<',$ARGV[0] or die "Unable to open input file: $!";
my @data;
while (<first>) {
if (not @data) {
@data = split;
next;
}
my @new = split /\s+/;
if ($new[0] eq $data[0] and $new[1] <= $data[2]+ 100) {
$data[2] = $new[2];
if ( $data[2] - $data[1] >= 500){
print join("\t", @new), "\n";
}
}
else {
@data = @new;
}
}
请帮忙。
【问题讨论】:
-
"col2 和 col3 中的值是连续的(就像一个连续的数字)",连续是什么意思?我不知道什么是连续数。
-
@Qtax :考虑 1 行(行),其 col3 为 100。然后我们必须查看下一行(行)的 col2 是否也是 100(或最多 200) .如果这种情况连续发生 5 行,则打印这 5 行。
-
M42 的答案应该适合你。
标签: perl