Ich verwende die Unix-Sortierung, um eine durch Kommas getrennte Datei mit mehreren Spalten zu sortieren. Bisher hat dies perfekt funktioniert, um die Daten entweder numerisch oder in alphabetischer Reihenfolge zu sortieren:
Beispieldatei vor dem Sortieren:
C,United States,WA,Tacoma,f,1
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
A,United States,NY,New York,f,1
Sortieren Sie die Datei: $ sort -t ',' -k 2,2 -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv
Sortiertes Ergebnis:
A,Bahamas,Bahamas,Nassau,f,2
A,Canada,QC,Montreal,f,2
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
Hier ist das Problem: Ich möchte Spalte 2 nach einer benutzerdefinierten Sortierung sortieren, dh ich möchte zuerst die USA, dann Kanada und dann die Bahamas:
Gewünschte Sorte:
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
Gibt es eine Möglichkeit, Unix-Sortierung eine benutzerdefinierte Sortierreihenfolge zu übergeben, die dann angewendet werden kann? Etwas wie:
$ sort -t ',' -k 2,2:'United States, Canada, Bahamas' -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv
Vielen Dank!
join
Befehl, aber Sie könnten viel sortieren - die Eingabedateien fürjoin
müssen in einer Reihenfolge sortiert werden, und dann würden Sie siesort
erneut verwenden, um die Daten zu speichern eine andere Reihenfolge (und Verlust der Spalte für die Sortierreihenfolge als Schritt nach der Sortierung).t
stattf
in der letzten Zeile geben?Antworten:
Die andere Antwort und der andere Kommentar beantworten die Frage im Allgemeinen. So kann eine Implementierung aussehen:
quelle
sed
wurde hier nicht wirklich gebraucht.Das kann man mit sort nicht machen . An diesem Punkt sollten Sie wirklich nach awk / perl / Ihrer Sprache Ihrer Wahl greifen . Sie können es jedoch fummeln. Sie können beispielsweise sed verwenden, um "USA" in 0, "Kanada" in 1 und "Bahamas" in 2 zu ändern, dann eine numerische Sortierung für diese Spalte durchzuführen und sie dann zurückzusetzen. Oder ändern Sie "USA" in "USA, 0" usw., sortieren Sie nach der zusätzlichen Spalte und verwerfen Sie sie dann.
quelle
Ich habe gerade einen Helfer namens csort geschrieben , um dies zu vereinfachen. Jeder Zeile wird ein Wert Ihrer Wahl vorangestellt, der auf Übereinstimmungen mit Teilzeichenfolgen oder regulären Ausdrücken innerhalb der Zeile basiert:
Die
2=STR
Notation bedeutet "Übereinstimmung, wenn das zweite Feld gleich istSTR
".Sie können die Ausgabe dann optional weiterleiten
cut -c3-
, um das Präfix zu entfernen.quelle