AKA*_*AIR 3 awk text-processing
我在 Ubuntu 机器上有这个数据集:
37.500 0.0000 0.005605
37.750 0.0000 -0.027858
38.000 0.0000 -0.060678
38.250 0.0000 -0.088557
38.500 0.0000 -0.109210
38.750 0.0000 -0.122482
39.000 0.0000 -0.129770
39.250 0.0000 -0.133190
39.500 0.0000 -0.134538
39.750 0.0000 -0.134015
40.000 0.0000 -0.129660
40.250 0.0000 -0.117858
40.500 0.0000 -0.094709
40.750 0.0000 -0.057622
41.000 0.0000 -0.006853
Run Code Online (Sandbox Code Playgroud)
我需要找到第 3 列的最大值,该最大值位于第 1 列的 38 和 40 之间。
这只是一个示例数据集。
awk '$1 >= 38 && $1 <= 40 && $3 > max {max = $3; out = $0};
END {print out}' input.txt
Run Code Online (Sandbox Code Playgroud)
注意:$3 没有正值,其中 38 <= $1 <= 40。这就是输出为空行的原因。(为什么?因为max默认为 0,并且没有一个负值高于该值)。
如果您想要最高值,无论是正值还是负值,请初始化max为小于 $3 中可能的最小值的值。例如-9999:
$ awk -v max=-9999 '$1 >= 38 && $1 <= 40 && $3 > max {max = $3; out = $0};
END {print out}' input.txt
38.000 0.0000 -0.060678
Run Code Online (Sandbox Code Playgroud)
或者,使用BEGIN块而不是-v:
$ awk 'BEGIN {max=-9999};
$1 >= 38 && $1 <= 40 && $3 > max {max = $3; out = $0};
END {print out}' input.txt
38.000 0.0000 -0.060678
Run Code Online (Sandbox Code Playgroud)
或者使用 perl,测试 $max 是否未定义,而不是将其初始化为不太可能的值:
$ perl -lane '
if ($F[0] >= 38 && $F[0] <= 40 && (!defined($max) || $F[2] > $max)) {
$max = $F[2];
$out = $_;
};
END { print $out }' input.txt
38.000 0.0000 -0.060678
Run Code Online (Sandbox Code Playgroud)