Snažím se řadit podle více sloupců. Výsledky nejsou podle očekávání.
Zde jsou moje data (people.txt):
Simon Strange 62
Pete Brown 37
Mark Brown 46
Stefan Heinz 52
Tony Bedford 50
John Strange 51
Fred Bloggs 22
James Bedford 21
Emily Bedford 18
Ana Villamor 44
Alice Villamor 50
Francis Chepstow 56
Následující funguje správně:
bash-3.2$ sort -k2 -k3 <people.txt
Emily Bedford 18
James Bedford 21
Tony Bedford 50
Fred Bloggs 22
Pete Brown 37
Mark Brown 46
Francis Chepstow 56
Stefan Heinz 52
John Strange 51
Simon Strange 62
Ana Villamor 44
Alice Villamor 50
Následující však nefunguje podle očekávání:
bash-3.2$ sort -k2 -k1 <people.txt
Emily Bedford 18
James Bedford 21
Tony Bedford 50
Fred Bloggs 22
Pete Brown 37
Mark Brown 46
Francis Chepstow 56
Stefan Heinz 52
John Strange 51
Simon Strange 62
Ana Villamor 44
Alice Villamor 50
Snažil jsem se třídit podle příjmení a potom podle křestního jména, ale uvidíte, že Villamorové nejsou ve správném pořadí. Doufal jsem v řazení podle příjmení, a když se příjmení shodují, v řazení podle křestního jména.
Zdá se, že na tom, jak by to mělo fungovat, je něco, čemu nerozumím. Mohl bych to udělat samozřejmě jiným způsobem (pomocí awk), ale chci porozumět třídění.
Používám standardní prostředí Bash na Mac OS X.
Přijatá odpověď:
Specifikace klíče jako -k2
znamená vzít v úvahu všechna pole od 2 do konce řádku. Takže Villamor 44
skončí před Villamor 50
. Protože tyto dva nejsou stejné, první srovnání v sort -k2 -k1
stačí k rozlišení těchto dvou řádků a druhého klíče řazení -k1
není vyvoláno. Kdyby byli dva Villamorové stejně staří, -k1
by způsobilo jejich řazení podle křestního jména.
Chcete-li seřadit podle jednoho sloupce, použijte -k2,2
jako klíčová specifikace. To znamená použít pole #2 až #2, tedy pouze druhé pole.
seřadit -k2 -k3
sort -k2
sort -k2,2 -k1,1 <people.txt
nebo ekvivalentně sort -k2,2 -k1
sort -k2,2
řadit
používá celý řádek jako poslední možnost, když jsou všechny klíče v podmnožině řádků identické.
Všimněte si také, že výchozím oddělovačem polí je přechod mezi neprázdným a prázdným, takže klíče budou obsahovat úvodní mezery (ve vašem příkladu pro první řádek bude první klíč "Emily" , ale druhý klíč
" Bedford"
. Přidejte -b
možnost odstranit tyto mezery:
sort -b -k2,2 -k1,1
To lze také provést na základě jednotlivých klíčů přidáním b
příznak na konci specifikace startu klíče:
sort -k2b,2 -k1,1 <people.txt
Ale je třeba mít na paměti:jakmile jeden takový příznak přidáte do specifikace klíče, globální příznaky (jako -n
, -r
…) se na ně již nevztahují, takže je lepší nesměšovat příznaky jednotlivých kláves a globální příznaky.