2016-08-06 14 views
1

複数の列を数値で並べ替えるときに、どうしていつもsortがどのように機能するか疑問に思った。たとえば:複数の列を数値で並べ替える

1 2 
2 10 
2 3 

をのでsort -gを行います。

echo -e " 2 3 \n 1 2 \n 2 10" | sort -n 

を生成します。私も数値的に第二のカラムを注文したい場合は、私が思いついた唯一の解決策は以下のとおりです。

1 2 
2 3 
2 10 

誰かがこの動作を説明してくださいしている場合言うことができる:所望の出力を生成し

echo -e " 2 3 \n 1 2 \n 2 10" | sort -k1n -k2n 

より単純なソリューションが存在しますか?

+0

"-g'各行の**プレフィックスを長い倍精度浮動小数点数に変換する数値的にソートします。 – melpomene

答えて

1

sortのためのPOSIX仕様は言う:

-n
ソートキーを初期nに制限するオプションの<blank>文字、オプションのマイナス記号、およびオプションの基数文字と(現在のロケールで定義されているような)千単位の区切り文字で構成された0以上の数字で構成されたumeric文字列で、算術値でソートされます。空の数字列はゼロとして扱われる。先行する0と0の符号は、順序に影響してはなりません。

これは実質的に-k1n,1と同じです。あなたは数値的に複数の列でソートしたい場合は、そう言わなければならない:

sort -k1n,1 -k2n,2 … 

は、コンマの後に「フィールドの終了」を省略することについては注意してください。

+0

基本的には、すべての列に-nオプションを指定する以外の方法はありません。ありがとう – WolfNZO

-1

(大手-k1nが必要とされていない)、よりシンプルではなくによってあまり:

echo -e " 2 3 \n 1 2 \n 2 10" | sort -k2n 

が出力:

1 2 
2 3 
2 10 
+0

これは数値的に1つの列のみをソートします。質問は2つの列を数値的にソートする方法です。それは本当に質問に答えていません。 –

+0

@JonathanLeffler、問題が文字通り解釈される場合、OPの入力は質問のあいまいな一致のようです。このような曖昧さを取り除くために、今朝私は、以下の4つのオプションのための4つの異なる 'sort '出力を生成するために、最短かつ最良の2列入力となるものを検討していました:1.' -k1n' 2. '-k2n' 3.' -k1n -k2n'4'-k2n -k1n 'となる。決して過去の段階を過ぎたことはありませんが、実際には2x3のセットが見つかりませんでした... – agc

+0

これは間違っています:最初の列が正しくソートされているだけです。この2番目の例を試してみると 'echo -e" 10 3 \ n 1 2 \ n 2 10 "| sort -k2n'とすると、最初の列に値10が2の前に置かれていることが分かります。 – WolfNZO

関連する問題