Comment utiliser awk tri par colonne 3

90

J'ai un fichier (user.csv) comme celui-ci

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

voulez imprimer toutes les colonnes triées par utilisateur,

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

user2452340
la source
11
sort -t, -k3 file
Kevin du

Réponses:

174

Que diriez-vous juste sort.

sort -t, -nk3 user.csv

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

  • -n- vous donne un tri numérique. Ajouté depuis que vous l'avez ajouté lors de 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.

jaypal singh
la source
2
Comment puis-je utiliser les colonnes de tri 2? par exemple, je veux trier d'abord par colonne 6, puis par colonne 3 secondes.
user2452340
1
Cela ne fonctionnera pas s'il y a des chaînes entre guillemets contenant des virgules dans le CSV (à moins que la colonne que vous souhaitez trier soit antérieure à la colonne contenant des virgules). Vous devrez peut-être faire un passage d'abord avec awk (en utilisant FPAT = "[^,] * | \" [^ \ "] * \" "et OFS =" | "ou un autre délimiteur que vous pourriez utiliser avec sort)
davemyron
1
@ user2452340 Vous pouvez faire ceci: sort -t, -nk3 filename.csv | sort -t, -nk6- d'abord il triera par colonne 3, puis triera par colonne 6 afin que la colonne 6 soit triée correctement jusqu'au bout et pour toutes les lignes où la colonne 6 est la même, celles-ci seront triées par colonne 3 .
Matthew le
3
@Matthew sort -t ',' -k3,3n -k6,6nsera meilleur. -k3utilisera la colonne 3 et le reste de la ligne.
Kusalananda le
1
J'avais juste besoin du -t, pour diviser mon fichier de 2 colonnes divisé par des virgules, merci jaypal
Ricardo Rivera Nieves
20
  1. Utilisez awk pour placer l'ID utilisateur devant.
  2. Trier
  3. Utilisez sed pour supprimer l'ID utilisateur en double, en supposant que les ID utilisateur ne contiennent aucun espace.

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    
utilisateur3781670
la source
Ceci est très utile, en particulier si vous devez analyser ou combiner des colonnes pour ajouter un champ de tri, puis ne conserver que la ligne d'origine. J'ai utilisé awk / split pour analyser / combiner les champs de date et d'heure pour un tri, puis supprimer.
skytaker
1
sortsait déjà comment trier selon une colonne particulière, mais cette technique - connue sous le nom de transformée de Schwartz - est utile lorsque le champ sur lequel vous souhaitez trier n'est pas trivialement une colonne bien définie.
tripleee
10

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

awk -F\: '{print $1|"sort -u"}' /etc/passwd
Diego Roberto Dos Santos
la source
9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

et pour l'ordre inverse

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

essaye ça -

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

OU

sort -t',' -nk3 user.csv
VIPIN KUMAR
la source
2
awk -F "," '{print $0}' user.csv | sort -nk3 -t ','

Cela devrait fonctionner

user13608932
la source
0

Pour exclure la première ligne (en-tête) du tri, je l'ai divisée en deux tampons.

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