找到第 3 列的最小值和最大值并打印整行

找到第 3 列的最小值和最大值并打印整行

我有大量由 3 列组成的数据集。我希望能够在第三列中找到最大值和最小值(有零和负值的混合,所以我想找到最大负值和最小负值),然后打印该特定行。我怎样才能做到这一点?

输入示例:

-6.4 -3.6 -0.00
-6.4 -3.5 -0.00
-6.4 -3.5 -0.00
-6.4 -3.5 -0.00
.
.
.
-2.4 -1.6 -14.50
-2.4 -1.5 -14.49
-2.4 -1.5 -14.49
-2.4 -1.5 -14.49
.
.
.
-5.4 -2.6 -4.52
-5.4 -2.6 -4.53
-5.4 -2.6 -4.50
-5.4 -2.6 -0.00
-5.4 -2.6 -0.00

输出:最小值:-2.4 -1.6 -14.50

最大值:-5.4 -2.6 -4.50

答案1

您已经接受了答案,但这里有一个更简单的方法:

egrep -v "0.00|^\." file.txt | awk 'NR==1 {print "min:",$0} END{print"max:",$0}'

输出:

min: -2.4 -1.6 -14.50
max: -5.4 -2.6 -4.50

- 由于您不需要零,即使它们实际上是最大的数字,因此该egrep -v命令会打印除包含 0.00 并以“.”开头的行之外的所有行。

-完成上述操作后,各行已按从小到大的顺序排列。awk然后打印带有“min:”前缀的第一行和带有“max:”前缀的最后一行。

如果该列中的值碰巧不按顺序排列,您可以sort -k3在命令之后通过管道传输(假设它是您要排序的第三列)egrep,然后将其通过管道传输到awk其后面的命令中。

答案2

我建议用 Python 来做这件事。如果您的数据以空格分隔,那么它将非常简单:

minVal = None
maxVal = None
with open('file') as f:
  for line in f:
    # default: split on whitespace.
    third = int(line.split()[2])
    if not minVal:
      # initialize the values
      minVal = third
      maxVal = third
    else:
      minVal = min(third, minVal)
      maxVal = max(third, maxVal)

print("min", minVal)
print("max", maxVal)

编辑:鉴于您想要整行,您应该存储minRowmaxRow。过去,当我不得不做这样的事情时,我使用了自定义的最小/最大函数。两者都采用key参数来指定自定义函数。

答案3

您可以尝试使用 awk :

awk -v 'f=1' '
  NF==3 {
    min = min < $3 ? min : $3
    if ( min != oldmin ) {
      a = $0
      oldmin = min
      }
    if ( $3 < 0 ) {
      if ( f ) {
        max = min
        f = 0
      }
      max = max > $3 ? max : $3
    }
    if ( max != oldmax ) {
      oldmax = max
      b = $0
      }
    }
  END {
    print "min : " a RS "max : " b
    }
' infile

相关内容