Sorteren op basis van de derde kolom

Ik'ben geconfronteerd met een enorme 4-koloms bestand. Ik'wil het gesorteerde bestand in stdout weergeven op basis van de 3e kolom:

cat myFile | sort -u -k3

Is dat genoeg om de truc uit te voeren?

Oplossing
sort -k 3,3 myFile

zou het bestand gesorteerd op de 3rd kolom weergeven, ervan uitgaande dat de kolommen worden gescheiden door reeksen spaties (ASCII SPC en TAB tekens in de POSIX/C locale), volgens de sorteervolgorde gedefinieerd door de huidige locale.

Merk op dat de voorlopende spaties inclusief zijn in de kolom (het standaard scheidingsteken is de overgang van een niet-spatie naar een spatie), dat kan een verschil maken in locales waar spaties niet worden genegeerd voor vergelijkingsdoeleinden, gebruik de -b optie om de voorlopende spaties te negeren.

Merk op dat het volledig onafhankelijk is van de shell (alle shells zouden die commandoregel hetzelfde parsen, shells hebben over het algemeen het sort commando niet ingebouwd).

-k 3 is om te sorteren op het gedeelte van de regels dat begint met de 3rd kolom (inclusief de voorloopspaties). In de C locale, omdat de spatie en tab tekens voor alle afdrukbare tekens staan, zal dat over het algemeen hetzelfde resultaat geven als -k 3,3 (behalve voor regels die een identiek derde veld hebben),

-u is om slechts een van de regels te behouden als er meerdere zijn die identiek sorteren (dat is waar de sorteersleutel hetzelfde sorteert (dat'is niet noodzakelijkerwijs hetzelfde als gelijk zijn)).

cat is het commando om te concatenate. Dat heb je hier niet nodig.

Als de kolommen door iets anders worden gescheiden, heb je de -t optie nodig om het scheidingsteken op te geven.

Gegeven voorbeeld bestand a

$ cat a
a c c c
a b ca d
a b  c e
a b c d

Met -u -k 3:

$ echo $LANG
en_GB.UTF-8

$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b  c e

Lijn 2 en 3 hebben dezelfde derde kolom, maar hier is de sorteersleutel van de derde kolom tot het einde van de lijn, dus -u behoudt beide. ␠ca␠d sorteert voor ␠c␠c omdat spaties in mijn locale worden genegeerd in de eerste doorgang, cad sorteert voor cc.

$ sort -u -k 3,3 a
a b c d
a b  c e
a b ca d

Hierboven wordt er maar één behouden voor die waar de 3de kolom ␠c is. Merk op dat die met ␠␠c (2 voorloop spaties) behouden blijft.

$ sort -k 3 a
a b ca d
a c c c
a b c d
a b  c e
$ sort -k 3,3 a
a b c d
a c c c
a b  c e
a b ca d

Zie hoe de volgorde van a b c d en a c c c zijn omgedraaid. In het eerste geval, omdat ␠c␠c sorteert voor ␠c␠d, in het tweede geval omdat de sorteersleutel hetzelfde is (␠c), zet de vergelijking in laatste instantie die de regels volledig vergelijkt a b c d voor a c c c.

$ sort -b -k 3,3 a
a b c d
a b  c e
a c c c
a b ca d

Als we de spaties negeren, is de sorteersleutel voor de eerste 3 regels hetzelfde (c), dus worden ze gesorteerd door de vergelijking in laatste instantie.

$ LC_ALL=C sort -k 3 a
a b  c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b  c e
a b c d
a c c c
a b ca d

In de C locale sorteert ␠␠c voor ␠c, omdat er daar maar één pass is waar karakters (dan enkele bytes) sorteren op basis van hun codepuntwaarde (waarbij spatie een lagere codepunt heeft dan c).

Commentaren (7)

Als je "column" opvat als in tekstbestand (4e karakter) dan ja, dan zou je oplossing moeten werken (of zelfs sort -u -k3 myFile om sort wat geheugenbesparende toverkunsten te laten uitvoeren met willekeurige toegang). Als je "column&quot begrijpt als in database - een hele entiteit van gegevens gevolgd door een scheidingsteken, en variabele kolombreedte, dan heb je iets chiquers nodig b.v. dit sorteert ls -l op grootte

      ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-

(wat equivalent is aan het triviale ls -lS maar het voorbeeld dient).

Commentaren (2)
sort -g -k column_number 

is het juiste commando om een lijst met numerieke tekens te sorteren op een specifieke kolom

Commentaren (2)