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


22

明確にする:

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

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シェルと互換性があります。


[ややOT]:この特定のデータと同等です-g-n、数値比較の代わりにGNUソート(一般的な数値)オプションを使用する方が安全です。浮動小数点と整数の両方で正しく動作します。
アリエル

回答:


32

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

sort -k1,1nr -k2,2 inputfile

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

POSIXソートから引用:

-k keydef

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

field_start [ type ] [ 、field_end [ type ]]

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

複数のキーフィールドがある場合、前のすべてのキーが等しく比較された後にのみ、後のキーが比較されます。時を除いて-uオプションが指定され、それ以外の場合は等しいとラインは、オプションのどれかのように注文されなければならない-d-f-i-n、または-kした存在(ただし、と-r 、まだ実際には、それが指定されている場合)との重要なラインのすべてのバイトで比較。まだ等しいと比較される行が書き込まれる順序は指定されていません。

これにより、以下が生成されます。

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

ありがとう。トリックをしました。受け入れるには10分待たなければなりません!
ポウヤ14年

@StephaneChazelas指摘してくれてありがとう。参照を更新しました。
devnull
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.