明確にさせてください:
使用頻度の高いキーワードがあるとします。
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
引数ですが、方法がわかりません!
sort
のbash
コマンドのみを使用してこれを行う方法を知りたいです。ただし、sort
だけでこれを実現できない場合は、他のコマンドがBourne Shell互換である必要があります。
基準でソートキーを個別に指定します。
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_start、field_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