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