teutara
teutara

Reputation: 635

Bash output the line with highest value

my question is pretty much like this one but with one difference; i want the output the line that has highest score on the 3rd tab. my data is like:

1.gui  Qxx  16
2.gui  Qxy  23
3.guT  QWS  11

and i want to get this:

1.gui  Qxy  23
3.guT  QWS  11

I used:

cat file.f | uniq | cut -d" " -f3 | sort | uniq -d >>out.f

but did not get what i want!?

Upvotes: 6

Views: 27226

Answers (3)

Eric González
Eric González

Reputation: 485

This must give you the highest value for those lines where the name is repeated and conserve those lines that have not repeated names.

sort -rk3 file | awk '!seen[$1]++' > file_filtered.txt

Upvotes: 0

teutara
teutara

Reputation: 635

for future users with same question:

do not forget to introduce -n switch to the -sort command, or your values are ordered starting from 9999's and followed by 999's etc.. so use

sort -rnk3 file

and if you want to get only one line with highest value (remove duplicates) use this:

sort -rnk3 file | awk '!x[$2]++'

and if you have an usual delimiter you can tell -awk to notice:

sort -rnk3 file | awk -F"[. ]" '!x[$2]++'

Upvotes: 5

Chris Seymour
Chris Seymour

Reputation: 85775

With sort:

$ sort -rk3 file             # Sort on column 3, display all results

2.gui  Qxy  23
1.gui  Qxx  16
3.guT  QWS  11

$ sort -rk3 file | head -2   # Sort on column 3, filter number of results

2.gui  Qxy  23
1.gui  Qxx  16

$ sort -rk3 file | uniq      # Sort on column 3, on display unique results 

2.gui  Qxy  23
1.gui  Qxx  16
3.guT  QWS  11

-r reverse sort, highest first.

-k3 sort on the 3rd column.


If you only want to display line which the 3rd column is greater than some value (i.e. 15) then try this using awk:

awk '$3>15' file | sort -rk3  # Display line where column 3 > 15 and sort

2.gui  Qxy  23
1.gui  Qxx  16

Upvotes: 10

Related Questions