How to use awk sort by column 3

Awk

Awk Problem Overview


I have a file (user.csv)like this

ip,hostname,user,group,encryption,aduser,adattr

want to print all column sort by user,

I tried awk -F ":" '{print|"$3 sort -n"}' user.csv , it doesn't work.

Awk Solutions


Solution 1 - Awk

How about just sort.

sort -t, -nk3 user.csv

where

  • -t, - defines your delimiter as ,.

  • -n - gives you numerical sort. Added since you added it in your attempt. If your user field is text only then you dont need it.

  • -k3 - defines the field (key). user is the third field.

Solution 2 - Awk

  1. Use awk to put the user ID in front.

  2. Sort

  3. Use sed to remove the duplicate user ID, assuming user IDs do not contain any spaces.

     awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    

Solution 3 - Awk

You can choose a delimiter, in this case I chose a colon and printed the column number one, sorting by alphabetical order:

awk -F\: '{print $1|"sort -u"}' /etc/passwd

Solution 4 - Awk

awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

and for reverse order

awk -F, '{ print $3, $0 }' user.csv | sort -nrk2 

Solution 5 - Awk

Seeing as that the original question was on how to use awk and every single one of the first 7 answers use sort instead, and that this is the top hit on Google, here is how to use awk.

Sample net.csv file with headers:

ip,hostname,user,group,encryption,aduser,adattr
192.168.0.1,gw,router,router,-,-,-
192.168.0.2,server,admin,admin,-,-,-
192.168.0.3,ws-03,user,user,-,-,-
192.168.0.4,ws-04,user,user,-,-,-

And sort.awk:

#!/usr/bin/awk -f
# usage: ./sort.awk -v f=FIELD FILE

BEGIN { 
   FS="," 
}

# each line
{ 
   a[NR]=$0 ""
   s[NR]=$f ""  
}

END {
   isort(s,a,NR); 
   for(i=1; i<=NR; i++) print a[i]
}

#insertion sort of A[1..n]
function isort(S, A, n, i, j) {
   for( i=2; i<=n; i++) {
      hs = S[j=i]
      ha = A[j=i]
      while (S[j-1] > hs) { 
         j--; 
         S[j+1] = S[j]
         A[j+1] = A[j] 
      }
      S[j] = hs
      A[j] = ha
   }
}

To use it:

awk sort.awk f=3 < net.csv  # OR 

chmod +x sort.awk
./sort.awk f=3 net.csv

Solution 6 - Awk

try this -

awk '{print $0|"sort -t',' -nk3 "}' user.csv

OR

sort -t',' -nk3 user.csv

Solution 7 - Awk

awk -F "," '{print $0}' user.csv | sort -nk3 -t ','

This should work

Solution 8 - Awk

To exclude the first line (header) from sorting, I split it out into two buffers.

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'

Solution 9 - Awk

With GNU awk:

awk -F ',' '{ a[$3]=$0 } END{ PROCINFO["sorted_in"]="@ind_str_asc"; for(i in a) print a[i] }' file

See 8.1.6 Using Predefined Array Scanning Orders with gawk for more sorting algorithms.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser2452340View Question on Stackoverflow
Solution 1 - Awkjaypal singhView Answer on Stackoverflow
Solution 2 - Awkuser3781670View Answer on Stackoverflow
Solution 3 - AwkDiego Roberto Dos SantosView Answer on Stackoverflow
Solution 4 - AwkvsinghView Answer on Stackoverflow
Solution 5 - AwkdagelfView Answer on Stackoverflow
Solution 6 - AwkVIPIN KUMARView Answer on Stackoverflow
Solution 7 - Awkuser13608932View Answer on Stackoverflow
Solution 8 - Awkrupert160View Answer on Stackoverflow
Solution 9 - AwkCyrusView Answer on Stackoverflow