109 votes

Comment utiliser awk sort by column 3

J'ai un fichier (user.csv)comme ceci

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

Je veux imprimer toutes les colonnes triées par utilisateur,

J'ai essayé awk -F ":" '{print|"$3 sort -n"}' user.csv ça ne marche pas.

212voto

jaypal Points 34440

Pourquoi ne pas simplement sort .

sort -t, -nk3 user.csv

donde

  • -t, - définit votre délimiteur comme , .

  • -n - vous donne un tri numérique. Ajouté puisque vous l'avez ajouté dans votre tentative. Si votre champ utilisateur est uniquement du texte, vous n'en avez pas besoin.

  • -k3 - définit le champ (clé). L'utilisateur est le troisième champ.

25voto

user3781670 Points 251
  1. Utilisez awk pour mettre l'ID utilisateur devant.
  2. Trier
  3. Utilisez sed pour supprimer l'ID utilisateur en double, en supposant que les ID utilisateurs ne contiennent pas d'espaces.

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

11voto

Vous pouvez choisir un délimiteur, dans ce cas j'ai choisi un deux-points et j'ai imprimé la colonne numéro un, en triant par ordre alphabétique :

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

10voto

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

et pour l'ordre inverse

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

8voto

dagelf Points 151

Étant donné que la question originale portait sur la façon d'utiliser awk et chacune des 7 premières réponses utilise sort à la place, et qu'il s'agit du premier résultat sur Google, voici comment l'utiliser awk .

Exemple de fichier net.csv avec des en-têtes :

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,-,-,-

Et trier.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
   }
}

Pour l'utiliser :

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X