Verwendung der awk-Sortierung nach Spalte 3

89

Ich habe eine Datei (user.csv) wie diese

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

möchten alle Spalten nach Benutzer sortieren,

Ich habe es versucht awk -F ":" '{print|"$3 sort -n"}' user.csv, es funktioniert nicht.

user2452340
quelle
10
sort -t, -k3 file
Kevin

Antworten:

170

Wie wäre es einfach sort.

sort -t, -nk3 user.csv

wo

  • -t,- definiert Ihr Trennzeichen als ,.

  • -n- gibt Ihnen numerische Sortierung. Hinzugefügt, seit Sie es in Ihrem Versuch hinzugefügt haben. Wenn Ihr Benutzerfeld nur aus Text besteht, benötigen Sie ihn nicht.

  • -k3- definiert das Feld (Schlüssel). Benutzer ist das dritte Feld.

jaypal singh
quelle
2
Wie kann ich Sort 2 Spalten verwenden? Zum Beispiel möchte ich zuerst nach Spalte 6 und dann nach Spalte 3 sortieren.
user2452340
1
Dies funktioniert nicht, wenn in der CSV Zeichenfolgen in Anführungszeichen stehen, die Kommas enthalten (es sei denn, die Spalte, nach der Sie sortieren möchten, ist früher als die kommagehaltige Spalte). Möglicherweise müssen Sie zuerst mit awk einen Pass ausführen (mit FPAT = "[^,] * | \" [^ \ "] * \" "und OFS =" | "oder einem anderen Trennzeichen, das Sie mit sort verwenden können)
Davemyron
1
@ user2452340 Sie können dies tun: sort -t, -nk3 filename.csv | sort -t, -nk6- Zuerst wird nach Spalte 3 sortiert, dann nach Spalte 6, damit Spalte 6 vollständig sortiert wird, und für alle Zeilen, in denen Spalte 6 identisch ist, werden diese nach Spalte 3 sortiert .
Matthew
3
@ Matthew sort -t ',' -k3,3n -k6,6nwird besser sein. -k3verwendet Spalte 3 und den Rest der Zeile.
Kusalananda
1
Ich brauchte nur das -t, um meine 2-Spalten-Datei durch Kommas zu teilen, danke jaypal
Ricardo Rivera Nieves
18
  1. Verwenden Sie awk, um die Benutzer-ID in den Vordergrund zu stellen.
  2. Sortieren
  3. Verwenden Sie sed, um die doppelte Benutzer-ID zu entfernen, vorausgesetzt, die Benutzer-IDs enthalten keine Leerzeichen.

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
user3781670
quelle
Dies ist sehr nützlich, insbesondere wenn Sie Spalten analysieren oder kombinieren müssen, um ein Sortierfeld hinzuzufügen, und dann nur die ursprüngliche Zeile beibehalten müssen. Ich habe awk / split verwendet, um Datums- und Zeitfelder für eine Sortierung zu analysieren / zu kombinieren und dann zu entfernen.
Skytaker
sortweiß bereits, wie man nach einer bestimmten Spalte sortiert, aber diese Technik - bekannt als Schwartzsche Transformation - ist nützlich, wenn das Feld, nach dem Sie sortieren möchten, nicht trivial eine genau definierte Spalte ist.
Tripleee
9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

und für umgekehrte Reihenfolge

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

Sie können ein Trennzeichen auswählen. In diesem Fall habe ich einen Doppelpunkt ausgewählt und die Spalte Nummer eins gedruckt, sortiert nach alphabetischer Reihenfolge:

awk -F\: '{print $1|"sort -u"}' /etc/passwd
Diego Roberto Dos Santos
quelle
6

Versuche dies -

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

ODER

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

Das sollte funktionieren

user13608932
quelle
0

Um die erste Zeile (Kopfzeile) von der Sortierung auszuschließen, habe ich sie in zwei Puffer aufgeteilt.

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