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.


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.


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

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 

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

6

Versuche dies -

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

ODER

sort -t',' -nk3 user.csv

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

Das sollte funktionieren


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"}'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.