我有一个以逗号分隔的文件,如下所示:
100,00869184
6492,8361
1234,31
200,04071
我想用它sort
来对这个文件进行排序数值上由仅第一列。
期望结果:
100,00869184
200,04071
1234,31
6492,8361
我如何使用排序来实现这一点?即使我这样称呼它们,逗号似乎也被视为千位分隔符而不是分隔符。
两者sort -t',' -n
都给sort -t',' -nk1'
我这个:
1234,31
200,04071
6492,8361
100,00869184
按默认值(无参数)排序或使用sort -t','
会给我以下结果:
100,00869184
1234,31
200,04071
6492,8361
按数字排序sort -n
得到以下结果:
1234,31
200,04071
6492,8361
100,00869184
我如何使用排序来达到我想要的结果?
编辑以添加:这是一次性操作,用于创建约 700 万行的排序列表,因此变通方法或其他非常规方法是完全可以接受的。
答案1
这当然是一种肮脏的解决方法,但我找到了一种方法来做到这一点,这要感谢@slhck关于语言环境的提示。如果有更好的答案对其他人更有帮助,我一定会接受,因为这几乎只适用于我的具体问题。
我将语言环境设置为西班牙语(玻利维亚语),以便逗号被视为小数点,然后标准数字排序就可以了。
$ export LC_NUMERIC="es_BO.utf8"
$ cat test.csv
100,00869184
6492,8361
1234,31
200,04071
$ sort -n test.csv
100,00869184
200,04071
1234,31
6492,8361
答案2
GNUsort
默认这样做:
$ cat test
100,00869184
6492,8361
1234,31
200,04071
$ gsort -nt',' < test
100,00869184
200,04071
1234,31
6492,8361
版本:
$ gsort --version
sort (GNU coreutils) 8.19
但有一个警告:如果你的排序没有按预期进行,那么你的locale
可能设置为其他值比C
。为什么会这样?locale
定义字母、数字、小数字符等的排序和解释。
要检查这一点,只需locale
在终端中输入。LC_NUMERIC
设置为en_US.UTF-8
,也许?这可以解释错误的排序顺序。将其设置回C
:
export LC_NUMERIC=C
然后,再次尝试sort
命令。如果要将全局变量设置locale
为C
,请执行以下操作:
export LC_ALL=C
答案3
尝试添加-g
应该执行数字排序的选项。
尝试:
sort -t',' -g <whatever>
答案4
更换分隔符:
cat commafile | tr , " " | sort -n
- 应该可以帮助你。