使用 Unix 在逗号分隔的文件中按数字排序

dpa*_*ery 8 unix csv sorting hp-ux

我有一个逗号分隔的文件,如下所示:

100,00869184
6492,8361
1234,31
200,04071
Run Code Online (Sandbox Code Playgroud)

我想使用第一列sort对这个文件进行数字排序。

预期结果:

100,00869184
200,04071
1234,31
6492,8361
Run Code Online (Sandbox Code Playgroud)

我如何使用排序来实现这一点?似乎逗号被视为千位分隔符而不是分隔符,即使我这样称呼它们也是如此。

双方sort -t',' -nsort -t',' -nk1'给我这个:

1234,31
200,04071
6492,8361
100,00869184
Run Code Online (Sandbox Code Playgroud)

按默认(无参数)排序或使用sort -t','给我这个:

100,00869184
1234,31
200,04071
6492,8361
Run Code Online (Sandbox Code Playgroud)

并按数字排序sort -n给了我这个:

1234,31
200,04071
6492,8361
100,00869184
Run Code Online (Sandbox Code Playgroud)

如何使用 sort 来达到我想要的结果?

编辑添加:这是一次操作,用于创建大约 700 万行的排序列表,因此解决方法或其他非正统方法是完全可以接受的。

dpa*_*ery 9

这当然是一个肮脏的解决方法,但由于@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
Run Code Online (Sandbox Code Playgroud)


slh*_*hck 6

sort默认情况下,GNU 会这样做:

$ cat test
100,00869184
6492,8361
1234,31
200,04071

$ gsort -nt',' < test
100,00869184
200,04071
1234,31
6492,8361
Run Code Online (Sandbox Code Playgroud)

版本:

$ gsort --version
sort (GNU coreutils) 8.19
Run Code Online (Sandbox Code Playgroud)

不过有一个警告:如果您的排序没有按预期工作,那么您locale的设置可能C. 为什么是这样?locale定义了字母、数字、十进制字符等的排序和解释。

要检查这一点,只需输入locale终端。被LC_NUMERIC设置为en_US.UTF-8,也许?这将解释错误的排序顺序。将其重新设置为C

export LC_NUMERIC=C
Run Code Online (Sandbox Code Playgroud)

然后,sort再次尝试您的命令。如果要将全局设置localeC,请执行以下操作:

export LC_ALL=C
Run Code Online (Sandbox Code Playgroud)