GNU/Linux >> Znalost Linux >  >> Linux

Pokoušíte se třídit podle dvou polí, druhá pak první?

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 je nadbytečné:je ekvivalentní sort -k2 . Chcete-li seřadit podle příjmení, potom jména a potom věku, spusťte následující příkaz:

sort -k2,2 -k1,1 <people.txt

nebo ekvivalentně sort -k2,2 -k1 protože existují pouze tato tři pole a oddělovače jsou stejné. Ve skutečnosti získáte stejný efekt z sort -k2,2 , protože řadit používá celý řádek jako poslední možnost, když jsou všechny klíče v podmnožině řádků identické.

Související:Jak grepovat text v souboru a zobrazit odstavec, který obsahuje text?

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.


Linux
  1. Jak vybrat první výskyt mezi dvěma vzory, které je obsahují?

  2. Přepnutí na druhou X session zabije první?

  3. Seřadit podle hexadecimální hodnoty?

  1. Třídit část souboru?

  2. Linux shell třídit soubor podle druhého sloupce?

  3. Porovnání dvou netříděných seznamů v linuxu, seznam jedinečných v druhém souboru

  1. Jak mohu získat slova mezi prvními dvěma výskyty textu/vzoru?

  2. Jak provést třídění ls podle přípony souboru a poté názvu?

  3. GNU řazení podle velikosti písmen