使用 Unix 对逗号分隔的文件中的数字进行排序

使用 Unix 对逗号分隔的文件中的数字进行排序

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

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命令。如果要将全局变量设置localeC,请执行以下操作:

export LC_ALL=C

答案3

尝试添加-g应该执行数字排序的选项。

尝试:

sort -t',' -g <whatever>

答案4

更换分隔符:

cat commafile | tr , " " | sort -n 

- 应该可以帮助你。

相关内容