Tips en Trucs 2018

Sorteren van tekenreeksen met getallen

De sort opdracht gebruik je om gegevensvelden te sorteren, maar computers sorteren niet zoals mensen. Zo komt gegeven PN.99 voor ons mensen voor PN.100. Computers sorteren door één voor één de tekens in de gegevens te vergelijken, waardoor de sort opdracht PN.100 voor PN.99 plaatst. Het cijfer 1 komt namelijk voor de 9.

dany@pindabook:~> echo -e "PN.99\nPN.100"
PN.99
PN.100
dany@pindabook:~> echo -e "PN.99\nPN.100" | sort
PN.100
PN.99

Om de sort opdracht zoals mensen te laten sorteren, voeg je de -V optie toe.

dany@pindabook:~> echo -e "PN.99\nPN.100" | sort -V
PN.99
PN.100

Hoe werkt het?

De -V optie (of --version) sorteert op versienaam en nummer, waarbij elke cijferreeks als een getal wordt beschouwd. Daardoor wordt de sorteeropdracht menselijker uitgevoerd. Deze truck werkt ook met getallen midden in een tekenreeks:

dany@pindabook:~> echo -e "P9n\nP10n"
P9n
P10n
dany@pindabook:~> echo -e "P9n\nP10n" | sort
P10n
P9n
dany@pindabook:~> echo -e "P9n\nP10n" | sort -V
P9n
P10n

Dit werkt zelfs als er meerdere getallen in de tekenreeksen voorkomen:

dany@pindabook:~> echo -e "P9d9n\nP9d10n\nP10d9n\nP10d10n" | shuf
P9d9n
P10d9n
P10d10n
P9d10n
dany@pindabook:~> echo -e "P9d9n\nP9d10n\nP10d9n\nP10d10n" | shuf | sort
P10d10n
P10d9n
P9d10n
P9d9n
dany@pindabook:~> echo -e "P9d9n\nP9d10n\nP10d9n\nP10d10n" | shuf | sort -V
P9d9n
P9d10n
P10d9n
P10d10n

De -V optie laat ook toe om op een bepaald veld te sorteren:

dany@pindabook:~> echo -e "P3\tN10\nP4\tN9"
P3      N10
P4      N9
dany@pindabook:~> echo -e "P3\tN10\nP4\tN9" | sort -t$'\t' -Vk2,2
P4      N9
P3      N10

Beperkingen

Bij het opgeven van de -V optie gaat sort op zoek naar tekenreeksen die er als volgt uitzien:

voorvoegsel[getal]achtervoegsel

Waarbij het achtervoegsel met de volgende reguliere expressie gedefinieerd wordt:

(\.[A-Za-z~][A-Za-z0-9~]*)*

De auteurs van de sort opdracht waarschuwen voor onverwachte sorteerresultaten. M.a.w. controleer steeds of sort correct sorteert. Dat de auteurs van sort een goede sorteermethode gebruiken, bewijst het volgende voorbeeld met geneste nummering:

dany@pindabook:~> echo -e "Pn.100\nPn.100.9\nPn.100.9.1" | shuf
Pn.100.9
Pn.100
Pn.100.9.1
dany@pindabook:~> echo -e "Pn.100\nPn.100.9\nPn.100.9.1" | shuf | sort -V
Pn.100
Pn.100.9
Pn.100.9.1

Let eveneens op met hoofdletters en kleine letters. Niet cijfers worden namelijk hoofdlettergevoelig gesorteerd.

dany@pindabook:~> echo -e "PN.100\nPn.99" | sort -V
PN.100
Pn.99
sort

Sorteerperikelen

Sorteren met een computer is verschrikkelijk ingewikkeld. We mogen de sort auteurs dan ook dankbaar zijn voor de -V optie. Zelfs rekenbladen hebben er moeite mee, en dat zijn specialisten in het verwerken van gegevens. Veel rekenbladgebruikers splitsen de gegevens dan in een deel met letters en het getal, sorteren de getallen en voegen de onderdelen terug samen. LibreOffice Calc bevat Natuurlijk sorteren, maar ook daar gaat het soms fout.