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


8

我有一个逗号分隔的文件,看起来像这样:

100,00869184
6492,8361
1234,31
200,04071

我想第一列sort对该文件进行数字排序。

预期结果:

100,00869184
200,04071
1234,31
6492,8361

如何使用sort实现此目的?似乎逗号被当作数千个分隔符而不是分隔符来对待,即使我这样称呼它们也是如此。

双方sort -t',' -nsort -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万行的排序列表的操作,因此完全可以接受解决方法或其他非常规方法。


在这里看到的示例似乎表明该-t选项在-t和字符之间有一个空格
SeanC 2012年

首先想到-使用削减。它基于给定的分隔符仅选择特定的列。也有“ Artem Ice”的答案。我爱tr。不过,我懒得编写和测试它。干杯!
Vorac 2012年

Answers:


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

嗯,我建议使用德语语言环境或类似语言。由于这是一个非常罕见的Unix版本,因此如果无法对其进行测试或没有可用的工具,就无法想到其他任何东西。
slhck

@slhck这似乎是我在UNIX上遇到的大多数问题的症结所在:)谢谢您的帮助,无论如何。
dpatchery 2012年

6

GNU sort默认执行此操作:

$ 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

我的环境中无法访问GNU。完成后是否可以轻松将其删除?如果有人愿意帮助我,可以在聊天室中HMU ...我是UNIX新手。
dpatchery 2012年

我很确定这只是一个locale问题。但是sort --version,实际上是什么呢?
slhck 2012年

sort --version给了我一个非法的论点。--过去命令对我也不起作用。我检查了手册页,没有明确调用任何版本,但是如果有帮助,它会列出“ HP-UX 11i版本2:2003年8月”。我的LC_NUMERIC设置为“ C”。
dpatchery 2012年

例如,德语语言环境将,用作小数点分隔符。我从来没有使用过HP-UX。
slhck 2012年

1

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

尝试:

sort -t',' -g <whatever>

不是-n数字排序吗?-g给我一个非法的选择。
dpatchery 2012年

-ggeneral-numeric-sort选项,实际上应在任何最新版本的中可用sort。@dpatchery
slhck 2012年

这是我的工作地点,因此我几乎绝对没有最新版本:)
dpatchery 2012年

0

更换分度计:

cat commafile | tr , " " | sort -n 

-应该可以帮到您。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.