複数の列で並べ替えようとしています。結果は期待どおりではありません。
これが私のデータ(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 OSXで標準のBashシェルを使用しています。
のような重要な仕様-k2
は、2から行末までのすべてのフィールドを考慮に入れることを意味します。したがってVillamor 44
、前に終了しVillamor 50
ます。これら2つは等しくないため、の最初の比較でsort -k2 -k1
これら2つの行を区別するのに十分であり、2番目のソートキー-k1
は呼び出されません。2つのVillamorが同じ年齢だった-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
...など)は適用されなくなるため、キーごとのフラグとグローバルフラグを混在させないようにすることをお勧めします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加