2009-08-31 16:20:22 +0000 2009-08-31 16:20:22 +0000
48
48

Hoe kan ik UNIX sorteren op slechts één kolom?

Ik weet dat de -k optie voor de Unix sort ons in staat stelt om te sorteren op een specifieke kolom en al het volgende. Bijvoorbeeld, gegeven het invoerbestand:

2 3
2 2
1 2
2 1
1 1

Met behulp van sort -n -k 1, krijg ik een uitvoer gesorteerd op de 1e kolom en vervolgens op de 2e:

1 1
1 2
2 1
2 2
2 3

Ik wil echter de volgorde van de 2e kolom behouden, zoals deze:

1 2
1 1
2 3
2 2
2 1

Is dit mogelijk met het sort commando?

Antwoorden (3)

68
68
68
2009-08-31 16:28:27 +0000

Probeer dit eens:

sort -s -n -k 1,1

De -s schakelt ‘last-resort’ sortering uit, die sorteert op alles wat geen deel uitmaakte van een opgegeven sleutel.

De -k 1 betekent niet echt “dit veld en alle volgende” in de context van numeriek sorteren, zoals je kunt zien als je op de tweede kolom probeert te sorteren. Je ziet alleen dat de banden verbroken worden door naar de rest van de regel te gaan. In het algemeen moet u echter -k 1,1 opgeven om alleen op veld één te sorteren.

10
10
10
2012-10-16 13:59:28 +0000

Om alleen op de eerste kolom te sorteren moet je doen:

sort -n -s -k1,1

Uit Unix and Linux System Administration Handbook

sort accepteert de sleutelspecificatie -k3 (in plaats van -k3,3), maar het doet waarschijnlijk niet wat u verwacht. Zonder het afsluitende veldnummer loopt de sort-sleutel door tot het einde van de regel

2
2
2
2016-12-30 17:47:12 +0000

Geen van de gegeven antwoorden werkt in het algemeen voor mij.

Zowel sort -s -k 2 file1 als sort -n -k1,1 doen extra sortering met dit bestand:

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

Ik moest precies dit doen en eindigde met een shell loop. Deze oplossing werkt misschien niet goed op een heel groot bestand, omdat het hele bestand moet worden gelezen voor elke unieke waarde in de gesorteerde kolom.

Hier is het bestand alleen gesorteerd op kolom 2.

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7