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.


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.


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/^.* //'
    

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

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

et pour l'ordre inverse

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

6

essaye ça -

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

OU

sort -t',' -nk3 user.csv

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

Cela devrait fonctionner


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"}'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.