我们如何从第 1 列的一系列值中找到第 3 列的最大值?

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 之间。

这只是一个示例数据集。

cas*_*cas 6

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)