Tips en Trucs 2020

Sorteren

Sort is een eenvoudige opdracht die je helpt bij het snel sorteren van informatie in de terminal. De sort opdracht werkt met (sorteert) tekstregels.

Zonder opties gebruikt sort standaard sorteerregels. Om onverwachte resultaten te vermijden, ben je dus best op de hoogte van de standaard sorteerregels.

Sort is veilig voor uw originele tekstgegevens, sort verwerkt de tekstgegevens en toont het resultaat in de terminal.

De standaard sorteerregels

Alfabetisch sorteren

De standaard sorteerregels zorgen steeds voor een alfabetische sortering van de tekstregels. Daarbij spelen hoofdletters of kleine letters geen rol.

Als voorbeeldbestand gebruik ik het bestand distros.txt met als inhoud:

dany@pindabook:~> cat distros.txt 
openSUSE
Debian
Raspberry PI OS
Ubuntu
Fedora

Met de volgende opdracht sorteer je de inhoud van het bestand distros.txt:

dany@pindabook:~> sort distros.txt 
Debian
Fedora
openSUSE
Raspberry PI OS
Ubuntu

Numeriek sorteren

Eerst pas ik het voorbeeldbestand aan naar:

dany@pindabook:~> cat distros.txt 
1. openSUSE
4. Debian
2. Raspberry PI OS
5. Ubuntu
3. Fedora

De sort opdracht geeft ons het volgende resultaat:

dany@pindabook:~> sort distros.txt 
1. openSUSE
2. Raspberry PI OS
3. Fedora
4. Debian
5. Ubuntu

Dit lijkt in orde, maar we hadden geluk. Opnieuw passen we het voorbeeldbestand aan naar:

dany@pindabook:~> cat distros.txt 
1. openSUSE
10. Debian
2. Raspberry PI OS
5. Ubuntu
23. Fedora

Een standaard sortering geeft nu:

dany@pindabook:~> sort distros.txt 
10. Debian
1. openSUSE
23. Fedora
2. Raspberry PI OS
5. Ubuntu

De getallen worden gesorteerd op hun eerste cijfer, eigenlijk is dit een alfabetische sortering. Om numeriek te sorteren, gebruik je de optie -n (--numeric-sort):

dany@pindabook:~> sort distros.txt -n
1. openSUSE
2. Raspberry PI OS
5. Ubuntu
10. Debian
23. Fedora

Volgorde omkeren

Je kunt de sorteervolgorde omkeren (alfabetisch van z naar a, enz.) met de optie -r (--reverse).

dany@pindabook:~> sort distros.txt -n -r
23. Fedora
10. Debian
5. Ubuntu
2. Raspberry PI OS
1. openSUSE

Willekeurige volgorde

De willekeurige volgorde bereik je met de optie -R (--random-sort), let op de hoofdletter.

dany@pindabook:~> sort distros.txt -R
23. Fedora
5. Ubuntu
1. openSUSE
2. Raspberry PI OS
10. Debian

Sorteren op maand

Met de optie -M (--month-sort) kan sort sorteren op maand. Daarbij houdt het rekening met verschillende datumformaten en lokale notaties. Om dit te testen, maken we het volgende voorbeeldbestand:

dany@pindabook:~> cat datums.txt
Maart
Feb
Februari
April
Augustus
Juli
Juni
November
Oktober
Jan
December
Mei
September
1
4
3
6
01/05/20
01/09/20
02/06/19

We sorteren dit bestand met sort:

dany@pindabook:~> sort datums.txt -M
01/05/20
01/09/20
02/06/19
1
3
4
6
Maart
Jan
Feb
Februari
April
Mei
Juni
Juli
Augustus
September
Oktober
November
December

De ontwikkelaar van sort, is blijkbaar niet helemaal op de hoogte van hoe we in Vlaanderen datums noteren. Dit leert ons dat we altijd kritisch naar resultaten van uitgevoerde opdrachten moeten kijken. Test dus steeds of je het gewenste resultaat bereikt.

Misschien wordt het tijd dat politici over gans de wereld inzien dat overeenkomen, bijvoorbeeld hoe je datums schrijft, onze wereld een stuk eenvoudiger zouden maken. En misverstanden en fouten veel minder zouden voorkomen. M.a.w. gebruik standaarden.

Resultaten opslaan

De sort opdracht past de originele informatie niet aan. Om de gesorteerde informatie op te slaan, moet je de sorteerresultaten naar een bestand sturen (redirect). Met de volgende opdracht slaan we het resultaat op in het bestand distros_gesorteerd.txt:

dany@pindabook:~> sort distros.txt -n > distros_gesorteerd.txt
dany@pindabook:~> cat distros_gesorteerd.txt 
1. openSUSE
2. Raspberry PI OS
5. Ubuntu
10. Debian
23. Fedora

Let wel, dat indien het bestand distros_gesorteerd.txt reeds bestond, dit overschreven wordt.

Sorteren op de tweede kolom

Tabellen worden dikwijls op kolommen gesorteerd. Om dit te demonstreren, passen we het voorbeeldbestand aan naar:

dany@pindabook:~> cat distros.txt 
1. openSUSE 100
10. Debian 400
2. Raspberry PI OS 300
5. Ubuntu 500
23. Fedora 200

Om dit bestand alfabetisch te rangschikken op de tweede kolom, gebruik je de optie -k 2 (--key=2):

dany@pindabook:~> sort distros.txt -k 2
10. Debian 400
23. Fedora 200
1. openSUSE 100
2. Raspberry PI OS 300
5. Ubuntu 500

Om op de derde kolom numeriek te sorteren:

dany@pindabook:~> sort distros.txt -k 3n
2. Raspberry PI OS 300
1. openSUSE 100
23. Fedora 200
10. Debian 400
5. Ubuntu 500

Hier gaat het fout, want de naam van de distributie bevat soms meer dan één woord (lees kolom). Om correct op kolommen te kunnen sorteren, moeten de kolommen gescheiden worden door unieke scheidingstekens, zoals bijvoorbeeld in CSV bestanden (Comma Separated Value). Het scheidingdingsteken, kan je bij sort ook meegeven met een optie. Pas het voorbeeldbestand aan naar:

dany@pindabook:~> cat distros.txt 
1.,openSUSE,100
10.,Debian,400
2.,Raspberry PI OS,300
5.,Ubuntu,500
23.,Fedora,200

Numeriek sorteren op de derde kolom, gescheiden door komma's:

dany@pindabook:~> sort distros.txt -k 3n -t ,
1.,openSUSE,100
23.,Fedora,200
2.,Raspberry PI OS,300
10.,Debian,400
5.,Ubuntu,500

De optie -t , zorgt hier dat de kolommen herkend worden aan een komma ertussen.

Dubbele regels verwijderen

Indien een bestand gelijke regels bevat, is het handig deze niet weer te geven. Deze keer maken we geen voorbeeldbestand aan, maar gebruiken we het resultaat van drie sort opdrachten die ons voorbeeldbestand willekeurig weergeeft:

dany@pindabook:~> ( sort distros.txt -R ; sort distros.txt -R ; sort distros.txt -R ) | cat
10.,Debian,400
5.,Ubuntu,500
23.,Fedora,200
1.,openSUSE,100
2.,Raspberry PI OS,300
1.,openSUSE,100
23.,Fedora,200
2.,Raspberry PI OS,300
10.,Debian,400
5.,Ubuntu,500
23.,Fedora,200
1.,openSUSE,100
10.,Debian,400
5.,Ubuntu,500
2.,Raspberry PI OS,300

De haken zorgen ervoor dat de drie sort opdrachten na elkaar worden uitgevoerd. Het resultaat van de drie sort opdrachten wordt doorgegeven (| pipe) aan de cat opdracht om het resultaat weer te geven.

Om het resultaat te sorteren met het verwijderen van de dubbele regels, gebruik je de optie -u (--unique):

dany@pindabook:~> ( sort distros.txt -R ; sort distros.txt -R ; sort distros.txt -R ) | sort -n -u
1.,openSUSE,100
2.,Raspberry PI OS,300
5.,Ubuntu,500
10.,Debian,400
23.,Fedora,200

Hoofdletter ongevoelig

Hoewel de meeste distributies standaard hoofdletter ongevoelig sorteren, kan je indien dit niet het geval is de optie -f (--ignore-case) toevoegen.

Help

Zoals bij elke opdracht, kan je je verder verdiepen in de mogelijkheden van de sort opdracht met behulp van de ingebouwde help tekst en de man pagina (man sort).

sort