2つのフィールドを最初に並べ替えてみてください。まず、2番目と1番目のフィールドを並べ替えてみてください。

2つのフィールドを最初に並べ替えてみてください。まず、2番目と1番目のフィールドを並べ替えてみてください。

複数の列を並べ替えようとしています。結果は予想と異なっていた。

これは私のデータです(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

姓、名前の順に並べ替えてみましたが、Veramosの順序が正しくないことがわかります。姓でソートしてから姓が一致したら、名前でソートしたいです。

私はこれがどのように機能するのか理解できないようです。もちろん、他の方法(awkを使用して)を実行することもできますが、ソートを理解したいと思います。

私はMac OS Xで標準のBashシェルを使用しています。

ベストアンサー1

キーなどの指定は、-k22から行末までのすべてのフィールドが考慮されることを意味します。だからVillamor 44それは前に終わったVillamor 50。 2つの行は同じではないので、最初の比較sort -k2 -k1だけで2つの行を区別するのに十分であり、2番目の-k1ソートキーは呼び出されません。 2人のVillamoが同じ年齢の場合は、名前に基づいて-k1ソートされます。

単一列でソートするには、-k2,2キー仕様として使用してください。これは、#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これら3つのフィールドのみがあり、区切り文字が同じであるためです。実際、行サブセットのすべてのキーが同じ場合、最後の手段として行全体を使用するのとsort -k2,2 <people.txt同じ効果が得られます。sort

さらに、デフォルトのフィールド区切り文字は、スペースではなくスペースとスペースの間の遷移であるため、キーに先行スペースが含まれます。たとえば、最初の行の場合、最初のキーはですが、"Emily"2番目のキー" Bedford"はです。追加の-b削除空のオプション:

sort -b -k2,2 -k1,1

bキー実行仕様の最後にフラグを追加して、キーごとにこれを実行することもできます。

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

ただし、覚えておくべきことの1つは、これらのフラグをキー仕様に追加するとグローバルフラグ(たとえば、-n... -r)がそのフラグに適用されなくなるため、キーごとのフラグとグローバルフラグを混在させないことが最善です。

おすすめ記事