Swarnabja Bhaumik
Swarnabja Bhaumik

Reputation: 137

AWK : To print data of a file in sorted order of result obtained from columns

I have an input file that looks somewhat like this:

PlayerId,Name,Score1,Score2
1,A,40,20
2,B,30,10
3,C,25,28

I want to write an awk command that checks for players with sum of scores greater than 50 and outputs the PlayerId,and PlayerName in sorted order of their total score.

When I try the following:

awk 'BEGIN{FS=",";}{$5=$3+$4;if($5>50) print $1,$2}' | sort -k5

It does not work and seemingly sorts them on the basis of their ids.

1 A
3 C

Whereas the correct output I'm expecting is : ( since Player A has sum of scores=60, and C has sum of scores=53, and we want the output to be sorted in ascending order )

3 C
1 A

In addition to this,what confuses me a bit is when I try to sort it on the basis of score1, i.e. column 3 but intend to print only the corresponding ids and names, it dosen't work either.

awk 'BEGIN{FS=",";}{$5=$3+$4;if($5>50) print $1,$2}' | sort -k3

And outputs :

1 A
3 C

But if the $3 with respect to what the data is being sorted is included in the print,

awk 'BEGIN{FS=",";}{$5=$3+$4;if($5>50)print $1,$2,$3}' | sort -k3

It produces the correct output ( but includes the unwanted score1 parameter in display )

3 C 25
1 A 40

But what if one wants to only print the id and name fields ?

Actually I'm new to awk commands, and probably I'm not using the sort command correctly. It would be really helpful if someone could explain.

Upvotes: 1

Views: 2491

Answers (2)

karakfa
karakfa

Reputation: 67467

if you outsource sorting, you need to have the auxiliary values and need to cut it out later, some complication is due to preserve the header.

 $ awk -F, 'NR==1 {print s "\t" $1 FS $2; next}
     (s=$3+$4)>50 {print s "\t" $1 FS $2 | "sort -n" }' file | cut -f2

PlayerId,Name
3,C
1,A

Upvotes: 2

Ed Morton
Ed Morton

Reputation: 203229

I think this is what you're trying to do:

$ awk 'BEGIN{FS=","} {sum=$3+$4} sum>50{print sum,$1,$2}' file |
    sort -k1,1n | cut -d' ' -f2-
3 C
1 A

You have to print the sum so you can sort by it and then the cut removes it.

If you wanted the header output too then it'd be:

$ awk 'BEGIN{FS=","} {sum=$3+$4} (NR==1) || (sum>50){print (NR>1),sum,$1,$2}' file |
    sort -k1,2n | cut -d' ' -f3-
PlayerId Name
3 C
1 A

Upvotes: 2

Related Questions