フィールドの数値に基づいてファイルを並べ替える方法は?


114

file.txt

  100 foo
  2 bar
  300 tuu

を使用する場合sort -k 1,1 file.txt、予想されるものの、行の順序は変更されません。

  2 bar
  100 foo
  300 tuu

数値で構成されるフィールドを絶対数値に基づいて並べ替える方法は?

回答:


149

ソートのためにmanページをのぞいてみてください ...

   -n, --numeric-sort
          compare according to string numerical value

だからここに例があります...

sort -n filename

1
みなさん、ありがとうございました!これはワイヤードです。これは、そのmanページを何度も行ったり来たりして、そのオプションが表示されなかったためです。ああ、私は簡略化されたmanページにいた。くそー!
lukmac '31年

1
浮動小数点の場合-g, --general-numeric-sortは、使用することをお勧めします。これにより、科学的表記、例えば1.234E10などがさらに許可されます
ヘルペスフリーエンジニア、

103

たとえば、ローリングログのファイル名など、テキストと数字が混在する文字列を並べ替える場合、並べ替えsort -nは期待どおりに機能しません。

$ ls |sort -n
output.log.1
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.2
output.log.20
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9

その場合、オプション-Vはトリックを行います:

$ ls |sort -V
output.log.1
output.log.2
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.20

マニュアルページから:

   -V, --version-sort
          natural sort of (version) numbers within text

1
これでつまづきましたので、よろしくお願いします!私を台無しにしたもう1つのことは、少なくとも私のcygwinでは、文字を削除して数字のみを残すために置換をls介してパイプライン処理した場合でもsed、色付きの出力も同様に影響を及ぼしていたことです。したがって、ランニングls --color=neverも違いを生みました。
Max Starkenburg、

すごい、-Vまさに私が探していたものです。最初にマニュアルページを見る習慣をつけるべきです。
srowley

18

さて、ここで他のほとんどの答えは参照します

sort -n

ただし、これが負の数で機能するかどうかはわかりません。これが、Fedora 9のソートバージョン6.10で得られる結果です。

入力ファイル:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

出力:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

これは明らかに数値順ではありません。

次に、より正確な答えは使用することですsort -nが、すべての値が正の場合のみです。

PS:sort -gこの例では、同じ結果が返されます

編集:

ロケール設定がマイナス記号の順序への影響に影響するようです(ここを参照)。適切な結果を得るために私はやった:

LC_ALL=C sort -n filename.txt



1

次のコマンドを実行する必要があります。

sort -n -k1 filename

それでうまくいくはずです:)



-4
    echo " Enter any values to sorting: "
read n
i=0;
t=0;
echo " Enter the n value: "
for(( i=0;i<n;i++ ))
do
read s[$i]
done
for(( i=0;i<n;i++ ))
do
for(( j=i+1;j<n;j++ ))
do
if [ ${s[$i]} -gt ${s[$j]} ]
then
t=${s[$i]}
s[$i]=${s[$j]}
s[$j]=$t
fi
done
done
for(( i=0;i<n;i++ ))
do
echo " ${s[$i]}  "
done

1
このコードが何をするかについて少し説明をテキストに追加してください。
Stedy 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.