0

I have huuuge sets of data consisting of 3 columns. I'd like to be able to find max and min values in the third column (there is mix of zeros and then negative values, so I want to find max negative and min negative value) and then print that particular row. How can I do that?

example input:

-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

output: min: -2.4 -1.6 -14.50

max: -5.4 -2.6 -4.50

5
  • Give an example of the data and the expected output. Jan 5, 2019 at 3:55
  • I've edited, hope it's clear now! Jan 5, 2019 at 4:02
  • 1
    Your expected output doesn't match your data. If the values in column three are all negative then the maximum value should be zero. Jan 5, 2019 at 4:10
  • Unfortunately there are negative zeros, but those data are meaningless. What I wrote is what I need to get. Jan 5, 2019 at 13:07
  • Zero is neither positive nor negative. I understand what you need but it's just stated wrongly. Jan 5, 2019 at 13:28

3 Answers 3

0

You've already accepted an answer but here's an easier way:

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

Output:

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

-As you don't want the zeroes even though they're actually the largest number, the egrep -v command prints all lines except those containing 0.00 and beginning with a "."

-After the above, the lines are already in order from smallest to largest. awk then prints the first line with "min:" prepended and the last line with "max:" prepended.

If the values in that column happen to not be in order, you can pipe sort -k3 (assuming it's the third column you want to sort) after the egrep command and then pipe it into the awk command after it.

0

I would suggest doing this in Python. If your data is whitespace-separated, it will be something as simple as:

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)

EDIT: given that you want the entire row, you should instead store minRow and maxRow. It the past, when I have had to do something like this, I have used a custom min/max function. Both take a key argument to specify a custom function.

0

You can try with 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
0

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .