10. december

sortér dine data

Står du og har brug for at ordne en telefonliste alfabetisk? Eller skal du lige lave en "top-tre" liste med de mest besøgte sider på dit websted? Eller har du brug for en liste med dine tyve største filer? Kommandoen sort er beregnet til at ordne linier i tekstfiler (eller kanaliserede data) alfabetisk eller efter talstørrelser.

Med kommandoen find $HOME/ -type f -printf "%s\t%p\n" kan du få en liste med størrelse og navn på alle filer under dit hjemmekatalog. En del af uddata fra kommandoen kan for eksempel se sådan ud:

1626    /home/sparre/Ada/Pakker/Billedbehandling/pixmaps.ali
5099    /home/sparre/Ada/Pakker/CGI/WebAda/cgi-characters.adb
855     /home/sparre/Ada/Pakker/CGI/WebAda/cgi-characters.ads

Med flaget "-n" kan vi sætte sort til at ordne efter talværdier og med flaget "-r" kommer de største værdier først. Jeg har prøvet på en af mine egne maskiner (head -n 5 begrænser uddata til de første fem linier fra forrige kommando):

$ find $HOME/ -type f -printf "%s\t%p\n" | sort -n -r | head -n 5
204716202       /home/sparre/Projekter/Partikelsporing/Data/run17.tracks
199545844       /home/sparre/Projekter/Partikelsporing/Data/run15.tracks
192787088       /home/sparre/Projekter/Partikelsporing/Data/run16.tracks
169727794       /home/sparre/Projekter/Partikelsporing/Data/run22.tracks
157438002       /home/sparre/Projekter/Partikelsporing/Data/run21.tracks
$

Som standard ser sort på starten af hver linie, når det skal finde ud af hvilken rækkefølge linierne skal ordnes i. Men nogle gange kan man få brug for at sortere på andre dele af linien end starten. Jeg har for eksempel en adresseliste, som jeg gerne vil have sorteret efter hvilken organisation folk tilhører:

$ cat adresseliste
Tux,            tux@linux.dk
Beastie,        beastie@bsd-dk.dk
Formand Toft,   formand-toft@sslug.dk
Punker Tux,     punk@sslug.dk
WWW-admin,      www_admin@sslug.dk
Postmesteren,   postmaster@bsd-dk.dk
$

Det der kendetegner hvilken organisation adresserne hører til i kommer efter et "@", så jeg kan løse problemet ved at give sort besked på at betragte "@" som skilletegn mellem felter med flaget "-t@", og give sort besked på at starte med at ordne udfra det andet felt på hver linie med flaget "-k2":

$ sort -t@ -k2 adresseliste
Beastie,        beastie@bsd-dk.dk
Postmesteren,   postmaster@bsd-dk.dk
Tux,            tux@linux.dk
Formand Toft,   formand-toft@sslug.dk
Punker Tux,     punk@sslug.dk
WWW-admin,      www_admin@sslug.dk
$

Et par andre flag til sort, som man tit kan få brug for er:

  • "-u", der fjerner gengangere, hvis der er flere ens linier.
  • "-m", der bruges når du vil flette to allerede sorterede filer sammen.