Sort

嘗試對兩個欄位進行排序,然後是第二個

  • April 22, 2021

我正在嘗試對多個列進行排序。結果並不如預期。

這是我的數據(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

以下工作正常:

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

但是,以下內容無法按預期工作:

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

我試圖按姓氏排序,然後按名字排序,但您會看到 Villamors 的順序不正確。我希望按姓氏排序,然後當姓氏匹配時,按名字排序。

似乎這應該如何工作我不明白。我當然可以用另一種方​​式(使用 awk),但我想了解排序。

我在 Mac OS X 上使用標準 Bash shell。

像這樣的關鍵規範-k2意味著考慮從 2 到行尾的所有欄位。所以Villamor 44結束之前Villamor 50。由於這兩個不相等,所以第一次比較sort -k2 -k1就足以區分這兩行,並且-k1不呼叫第二個排序鍵。如果這兩個維拉莫爾的年齡相同,-k1就會導致他們按名字排序。

要按單列排序,-k2,2請用作鍵規範。這意味著使用從#2 到#2 的欄位,即僅使用第二個欄位。

sort -k2 -k3 <people.txt是多餘的:它相當於sort -k2 <people.txt. 要按姓氏、名字、年齡排序,請執行以下命令:

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

或等效地sort -k2,2 -k1 <people.txt,因為只有這三個欄位並且分隔符相同。實際上,您將從 中獲得相同的效果sort -k2,2 <people.txt,因為sort當行子集中的所有鍵都相同時,將整行作為最後的手段。

另請注意,預設欄位分隔符是非空白和空白之間的過渡,因此鍵將包括前導空白(在您的範例中,對於第一行,第一個鍵將是"Emily",但第二個鍵" Bedford"。添加-b刪除這些空白的選項:

sort -b -k2,2 -k1,1

也可以通過在b密鑰開始規範的末尾添加標誌來在每個密鑰的基礎上完成:

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

但是要記住一點:一旦您將一個這樣的標誌添加到密鑰規範中,全域標誌(例如-n-r…)就不再適用於它們,因此最好避免混合每個鍵標誌和全域標誌。

引用自:https://unix.stackexchange.com/questions/52762