複数の列を並べ替えようとしています。結果は予想と異なっていた。
これは私のデータです(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
キーなどの指定は、-k2
2から行末までのすべてのフィールドが考慮されることを意味します。だから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
)がそのフラグに適用されなくなるため、キーごとのフラグとグローバルフラグを混在させないことが最善です。