ソートコマンド - csvで数値ソートが機能しない

ソートコマンド - csvで数値ソートが機能しない

LinuxのGNUは、sort私のcsvファイルに期待される結果を提供しません。この状況/問題を解決するのに役立ちますか?

入力ファイル

[nscruser]$ cat cemp1.txt
10,30
50,900
20,1050

目的上記のファイルの最初のフィールドを数字でソートする必要があります。

[nscruser]$  sort -t',' -k1 -n cemp1.txt
10,30
50,900
20,1050

期待される出力ただし、最初の列を数字で並べ替えるので、次のような出力が期待されます。

10,30
20,1050
50,900

なぜ違いが発生するのか教えてもらえますか?

答え1

sortマニュアルページ(GNU coreutils 8.32)を見ると、

-k、--key = KEYDEFキーによるソートKEYDEFは場所とタイプを提供します。

...

KEYDEF は開始位置と停止位置を表す F[.C][OPTS][,F[.C][OPTS]] です。ここで、Fはフィールド番号、Cはフィールドの文字位置です。どちらも原点1で、停止位置はデフォルトで行末に設定されます。 -t と -b の両方が有効でない場合、フィールドの文字は前のスペースの先頭から計算されます。 OPTSは、このキーのグローバルソートオプションをオーバーライドする1つ以上の単一文字ソートオプション[bdfgiMhnRrV]です。キーが指定されていない場合は、行全体がキーとして使用されます。無効なキーの使用を診断するには、--debugを使用してください。

まず、--debug提案どおりに使用できます。

$ sort -t',' -k1 -n --debug cemp1.txt
sort: text ordering performed using ‘en_IE.UTF-8’ sorting rules
sort: key 1 is numeric and spans multiple fields
10,30
_____
_____
50,900
______
______
20,1050
_______
_______

これは私たちに手がかりを与えます。 「キー1は数字で、複数のフィールドにまたがっています。」

マニュアルページには、「停止位置はデフォルトで行末に設定されています」と記載されています。したがって、停止位置を追加する必要があります。

$ sort -t',' -k1,1 -n cemp1.txt
10,30
20,1050
50,900

答え2

コマンドの前に、LANGまたはLC_ALLロケール変数を追加してみてください。

LANG=C sort -t',' -k1,1 -n cemp1.txt

または

LC_ALL=C sort -t',' -k1,1 -n cemp1.txt

使用される変数は、コマンドおよび/またはオペレーティングシステムのバージョンによって異なります。 HP-UX 11.31(Unixシステム5):man 3C locale解凍

LANG                LC_MESSAGES
LC_ALL              LC_MONETARY
LC_COLLATE          LC_NUMERIC
LC_CTYPE            LC_TIME

関連情報