嘗試對兩個欄位進行排序,然後是第二個
我正在嘗試對多個列進行排序。結果並不如預期。
這是我的數據(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
…)就不再適用於它們,因此最好避免混合每個鍵標誌和全域標誌。