Sortieren Sie durch Kommas getrennte Felder in jeder Zeile nach numerischen Werten

7

Ich habe es versucht:

$ echo "2,3435,1" | sort -n
2,3435,1

$ sort -t',' -n test_sort.txt
kill,gill,burger
110,20,30,13

$ cat test_sort.txt
110,20,30,13
kill,gill,burger

Warum funktioniert mein sortBefehl nicht ?

Mein gewünschter sortBefehl sollte folgendermaßen funktionieren:

$sort -t',' -n test_sort.txt  
110,13,20,30,burger,gill,kill

ANTWORT: tr, '\ n' <a | sort -n | Einfügen -sd, -

"Danke an Stéphane Chazelas"

sij
quelle
Was funktioniert nicht? Was ist die gewünschte Ausgabe?
Psimon
1
Das -tgibt an, was Felder trennt, sortordnet jedoch Datenzeilen neu an. Es verweist nur auf Felder, um zu bestimmen, nach welchem ​​Wert sortiert werden soll.
Bratchley
5
tr , '\n' < a | sort -n | paste -sd, -
Stéphane Chazelas
@ Stéphane Chazelas Sie Sir, sind wirklich großartig
sij
3
@ StéphaneChazelas Das solltest du als Antwort posten. Das Beantworten von Fragen in Kommentaren (etwas, an dem ich mich in der Vergangenheit schuldig gemacht habe) ist nicht wünschenswert.
David Conrad

Antworten:

10

sortarbeitet auf ganzen Linien. Standardmäßig wird der gesamte Inhalt dieser Zeile sortiert, es -kkann jedoch auch ein oder mehrere Felder in diesen Zeilen sortiert werden. -tkann verwendet werden, um das Trennzeichen zwischen Feldern zu ändern. Ich kann mir keinen Fall vorstellen, in dem das Verwenden -tohne auch das Verwenden -kSinn macht.

Ihr zweiter Befehl, der entspricht:

printf "%s\n%s\n" "110,20,30,13" "kill,gill,burger" | sort -t',' -n

produziert:

kill,gill,burger
110,20,30,13

Welches ist, was ich erwarten würde. -t','hat keine Auswirkung, da das Feldtrennzeichen geändert wird, wenn Sie sort nicht angewiesen haben, einzelne Felder zu bearbeiten, und daher kzuvor sortiert wurde, 1da der numerische Wert 0 ist (und Sie die numerische Reihenfolge mit angefordert haben -n).

godlygeek
quelle
6

Die Sortierung erfolgt zeilenweise und nicht nach Feldern innerhalb einer Zeile.

Standardmäßig wird nach dem ersten Zeichen in der Zeile sortiert und von dort aus fortgefahren. Sie können aber auch andere "Schlüssel" als am Anfang sortieren. Dies ist nützlich, wenn Sie nach Nachnamen oder einem numerischen Wert am Ende der Zeile usw. sortieren möchten. Dafür ist die -tFlagge gedacht - sie wird einzelne Zeilen nicht auflösen und darin sortieren.

Wenn Sie dies tun möchten, lesen Sie Inline-Felder sortieren

mattdm
quelle
2

Das Sortieren nach Kommas ist einigermaßen möglich:

echo "a,b,z,sa,b,z,a,d,2,4a,a,dx" | tr , "\n" | sort

Ausgänge

2
4a
a
a
a
b
b
d
dx
sa
z
z

Und wenn Sie es wieder in einer Zeile haben möchten:

echo "a,b,z,sa,b,z,a,d,2,4a,a,dx" | tr , "\n" | sort | tr "\n" ,
ubershmekel
quelle
paste -sd , -wäre besser alstr "\b" ,
Stéphane Chazelas
1

Es wird einfacher mit perl:

$ perl -F',' -anle '
    BEGIN { $" = "," }
    print "@{[sort {$a <=> $b} @F]}"
' file 
13,20,30,110
kill,gill,burger

Dies sortiert nur Zeilen, die Zahlen enthalten. Wenn Sie möchten, dass Sortierzeilen wie sort -nfolgt Zeichenfolgen enthalten , versuchen Sie Folgendes:

$ $ perl -MPOSIX=isdigit -F',' -anle '
BEGIN { $" = "," }
print "@{[ sort { isdigit($a)
              ? ($a <=> $b)
              : ($a cmp $b)
              } @F
        ]}"
' file
13,20,30,110
burger,gill,kill

Dieser Ansatz funktioniert immer noch nur, wenn like nur Zeichenfolge enthält, fehlgeschlagen mit like enthält gemischte Zeichenfolge, Zahlen wie kill,gill,20.

cuonglm
quelle