GNU/Linux >> Linux の 問題 >  >> Linux

2番目、次に最初の2つのフィールドで並べ替えようとしていますか?

複数の列で並べ替えようとしています。結果は期待どおりではありません。

これが私のデータ(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を使用して)これを別の方法で行うこともできますが、並べ替えについて理解したいと思います。

MacOSXで標準のBashシェルを使用しています。

承認された回答:

-k2のような主要な仕様 2から行末までのすべてのフィールドを考慮に入れることを意味します。つまり、 Villamor 44 Villamor 50の前に終了します 。これら2つは等しくないため、 sort -k2 -k1の最初の比較 これらの2行を区別するには十分であり、2番目のソートキー -k1 呼び出されません。 2つのVillamorsの年齢が同じだった場合、 -k1 名で並べ替えられたはずです。

単一の列で並べ替えるには、 -k2,2を使用します キー仕様として。これは、#2から#2までのフィールド、つまり2番目のフィールドのみを使用することを意味します。

sort -k2 -k3 冗長です: sort -k2 と同等です 。姓、名、年齢の順に並べ替えるには、次のコマンドを実行します。

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

または同等にsort-k2,2 -k1 これらの3つのフィールドのみがあり、セパレーターは同じであるためです。実際、 sort -k2,2 からも同じ効果が得られます。 、 sort 行のサブセット内のすべてのキーが同一である場合、最後の手段として行全体を使用します。

関連:ファイル内のテキストをgrepして、テキストを含む段落を表示するにはどうすればよいですか?

また、デフォルトのフィールドセパレータは非空白と空白の間の遷移であるため、キーには先頭の空白が含まれることに注意してください(この例では、最初の行の最初のキーは "Emily" 、ただし2番目のキー "Bedford" -bを追加します それらの空白を取り除くオプション:

sort -b -k2,2 -k1,1

b を追加することで、キーごとに実行することもできます。 キースタート仕様の最後にあるフラグ:

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

ただし、覚えておくべきことがあります。そのようなフラグをキー仕様に1つ追加するとすぐに、グローバルフラグ( -n など)が追加されます。 、 -r …)それらには適用されなくなったため、キーごとのフラグとグローバルフラグを混在させないようにすることをお勧めします。


Linux
  1. Lsを実行し、作成された日付で結果を並べ替える方法は?

  2. 2つのファイルを比較して、部分的に一致しない行を追加するにはどうすればよいですか?

  3. ファイルの一部を並べ替えますか?

  1. Lum –最初の列に従って2つのファイルの共通の値を置き換えますか?

  2. 2つのX画面、2番目の画面でウィンドウマネージャーを取得する方法は?

  3. Linuxシェルは、2番目の列に従ってファイルをソートしますか?

  1. Linuxで2つのソートされていないリストを比較し、2番目のファイルに一意のものをリストします

  2. テキスト/パターンの最初の 2 つのインスタンスの間の単語を取得するにはどうすればよいですか?

  3. 大文字と小文字を区別する GNU ソート