web-dev-qa-db-ja.com

最初の列の降順でデータを並べ替えます。値が等しい場合は、2番目の列を昇順で使用します

明確にさせてください:

使用頻度の高いキーワードがあるとします。

12 Hi
7  Hash
7  C++  
9  Superuser
17 Stackoverflow
9  LaTeX  
42 Life
9  Ubuntu

私が欲しいのは、このデータを頻度に基づいて降順で並べ替えることです。等しい値がある場合は、2番目の列を昇順で使用する必要があります。

sort -n -r foo.txt

最初の部分を実行しますが、2番目の列もreversedです:

42 Life
17 Stackoverflow
12 Hi
9  Ubuntu
9  Superuser
9  LaTeX  
7  Hash
7  C++

次の結果をどのように達成できますか?

42 Life
17 Stackoverflow
12 Hi
9  LaTeX  
9  Superuser
9  Ubuntu
7  C++ 
7  Hash

-k引数ですが、方法がわかりません!

sortbashコマンドのみを使用してこれを行う方法を知りたいです。ただし、sortだけでこれを実現できない場合は、他のコマンドがBourne Shell互換である必要があります。

22
Pouya

基準でソートキーを個別に指定します。

sort -k1,1nr -k2,2 inputfile

これは、最初のキーが数値で逆順にソートされ、2番目のキーがdefaultソート順に従ってソートされることを指定します。

POSIXソート からの引用:

-kkeydef

keydef引数は、制限付きのソートキーフィールド定義です。この定義の形式は次のとおりです。

field_start[type] [、field_end[type]]

ここで、field_startおよびfield_endは、行の一部に制限されたキーフィールドを定義し(詳細説明セクションを参照)、タイプは文字「b」、「d」、「f」、「i」、「n」、「r」のリストからの修飾子。 'b'修飾子は-bオプションのように動作しますが、field_startまたはfield_endにのみ適用されます付属しています。他の修飾子は対応するオプションと同じように動作しますが、それらがアタッチされているキーフィールドにのみ適用されます。 field_startfield_end、またはその両方で指定されている場合、この効果があります。 field_startまたはfield_endに修飾子がアタッチされている場合、どちらにもオプションは適用されません。実装は、少なくとも9つの-kオプションのオカレンスをサポートする必要があります。これは、コマンドライン順で重要です。 -kオプションを指定しない場合は、行全体のデフォルトのソートキーが使用されます。

複数のキーフィールドがある場合、後のキーは、前のすべてのキーが等しい場合にのみ比較されます。 -uオプションが指定されている場合を除き、同等に比較される行は、オプション-d-f-i-n、または-kが存在し(ただし、指定されている場合は-rがまだ有効です)、行内のすべてのバイトが比較にとって重要です。それでも同等に比較する行が書き込まれる順序は指定されていません。

これは以下を生成します:

42 Life
17 Stackoverflow
12 Hi
9  LaTeX
9  Superuser
9  Ubuntu
7  C++
7  Hash
31
devnull