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',' -n
并sort -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 万行的排序列表,因此解决方法或其他非正统方法是完全可以接受的。
这当然是一个肮脏的解决方法,但由于@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)
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
再次尝试您的命令。如果要将全局设置locale
为C
,请执行以下操作:
export LC_ALL=C
Run Code Online (Sandbox Code Playgroud)