我有大量由 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)
编辑:鉴于您想要整行,您应该存储minRow
和maxRow
。过去,当我不得不做这样的事情时,我使用了自定义的最小/最大函数。两者都采用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