Petre Lamar
Petre Lamar

Reputation: 43

How to use AWK to print line with highest number?

I have a question. Assuming I dump a file and do a grep for foo and comes out the result like this:

Foo-bar-120:'foo name 1'
Foo-bar-130:'foo name 2'
Foo-bar-1222:'foo name 3'

Etc.

All I want is trying to extract the foo name with largest number. For instance in this case, largest number is 1222 and the result I expect is foo name 3

Is there a easy way using awk and sed to achieve this? Rather than pull the number out line by line and loop through to find the largest number?

Upvotes: 4

Views: 1987

Answers (6)

Ed Morton
Ed Morton

Reputation: 203625

$ awk '{gsub(/.*:.|.$/,"")} (NR==1)||($NF>max){max=$NF; val=$0} END{print val}' file
foo name 3

Upvotes: 1

captcha
captcha

Reputation: 3756

Code for :

awk -F[-:] '$3>a {a=$3; b=$4} END {print b}' file

$ cat file
Foo-bar-120:'foo name 1'
Foo-bar-130:'foo name 2'
Foo-bar-1222:'foo name 3'

$ awk -F[-:] '$3>a {a=$3; b=$4} END {print b}' file
'foo name 3'

Upvotes: 3

jaypal singh
jaypal singh

Reputation: 77105

You don't need to use grep. you can use awk directly on your file as:

awk -F"[-:]" '/Foo/ && $3>prev{val=$NF;prev=$3}END{print val}' file

Upvotes: 0

Jim L.
Jim L.

Reputation: 6529

Here's how I would do it. I just tested this in Cygwin. Hopefully it works under Linux as well. Put this into a file, such as mycommand:

#!/usr/bin/awk -f

BEGIN {
        FS="-";
        max = 0;
        maxString = "";
}

{
        num = $3 + 0; # convert string to int
        if (num > max) {
                max = num;
                split($3, arr, "'");
                maxString = arr[2];
        }
}

END {
        print maxString;
}

Then make the file executable (chmod 755 mycommand). Now you can pipe whatever you want through it by typing, for example, cat somefile | ./mycommand.

Upvotes: 1

Kent
Kent

Reputation: 195079

is this ok for you?

awk -F'[:-]' '{n=$(NF-1);if(n>m){v=$NF;m=n}}END{print v}'

with your data:

kent$  echo "Foo-bar-120:’foo name 1’
Foo-bar-130:’foo name 2’
Foo-bar-1222:’foo name 3’"|awk -F'[:-]' '{n=$(NF-1);if(n>m){v=$NF;m=n}}END{print v}'
’foo name 3’

P.S. I like the Field separator [:-]

Upvotes: 1

glenn jackman
glenn jackman

Reputation: 246827

Assuming the line format is as shown with 2 hyphens before "the number":

cut -d- -f3- | sort -rn | sed '1{s/^[0-9]\+://; q}'

Upvotes: 1

Related Questions