相关疑难解决方法(0)

为什么不在每台机器上进行**排序**排序?

使用具有相同输入的相同排序命令会在不同的计算机上生成不同的结果.我该如何解决这个问题?

unix sorting bash ksh

12
推荐指数
2
解决办法
6569
查看次数

为什么UNIX排序实用程序在没有选项-b的情况下忽略前导空格?

[这是我向后问的一个类似问题的重写......抱歉这个混乱!]

我对领先的s和标准sort实用程序感到困惑.考虑以下内容myfile:

a
 b
  a
Run Code Online (Sandbox Code Playgroud)

执行sort -t : myfile收益意外的结果,至少对我来说:

a
  a
 b
Run Code Online (Sandbox Code Playgroud)

那有意义吗?<space>应该在之前a-z(如ASCII的情况)或之后.在第一种情况下,我会期待

  a
 b
a
Run Code Online (Sandbox Code Playgroud)

而在第二种情况下

a
 b
  a
Run Code Online (Sandbox Code Playgroud)

那么,为什么sort看起来似乎应用了-b选项(忽略前导s),如果不包括它?事实上,为了安全起见,我添加了-t选项,以便在每一行中只有一个字段.(根据POSIX标准,"字段包含最大的非分隔字符序列,并且在没有选项-t的情况下,任何前面的字段分隔符." sort myfile产生相同的输出,这也是意外的.)

提前致谢!

unix

7
推荐指数
2
解决办法
3249
查看次数

来自gnu排序的意外结果

当我尝试对以下文本文件'input'进行排序时:

test1 3   
test3 2
test 4
Run Code Online (Sandbox Code Playgroud)

用命令

sort input
Run Code Online (Sandbox Code Playgroud)

输出正好是输入.这是输出

od -bc input
Run Code Online (Sandbox Code Playgroud)

:

0000000 164 145 163 164 061 011 063 012 164 145 163 164 063 011 062 012
          t   e   s   t   1  \t   3  \n   t   e   s   t   3  \t   2  \n
0000020 164 145 163 164 011 064 012
          t   e   s   t  \t   4  \n
0000027
Run Code Online (Sandbox Code Playgroud)

它只是一个带有两列的制表符分隔文件.当我做

sort -k 2
Run Code Online (Sandbox Code Playgroud)

输出变为

test3 2
test1 3
test 4
Run Code Online (Sandbox Code Playgroud)

这是我所期待的.但如果我这样做

sort -k 1
Run Code Online (Sandbox Code Playgroud)

关于输入没有任何变化,而我希望'test'在'test1'之前排序.最后,如果我这样做 …

unix sorting gnu-sort

6
推荐指数
1
解决办法
497
查看次数

unix sort -n -t","给出意想不到的结果

即使我指定了分隔符,unix数字排序也会产生奇怪的结果.

$ cat example.csv  # here's a small example
58,1.49270399401
59,0.000192136419373
59,0.00182092924724
59,1.49270399401
60,0.00182092924724
60,1.49270399401
12,13.080339685
12,14.1531049905
12,26.7613447051
12,50.4592437035

$ cat example.csv | sort -n --field-separator=,
58,1.49270399401
59,0.000192136419373
59,0.00182092924724
59,1.49270399401
60,0.00182092924724
60,1.49270399401
12,13.080339685
12,14.1531049905
12,26.7613447051
12,50.4592437035
Run Code Online (Sandbox Code Playgroud)

对于此示例,无论是否指定分隔符,sort都会给出相同的结果.我知道如果我设置LC_ALL=C然后排序开始再次给出预期的行为.但我不明白为什么默认环境设置,如下所示,会使这种情况发生.

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)

我从许多其他问题(例如这里,这里这里)中读到了如何避免这种行为,但是,这种行为令人难以置信的奇怪和不可预测,并引起了我一周的心痛.有人可以解释为什么Mac OS X(10.8.5)上的默认环境设置排序会这样吗?换句话说:什么是排序(使用局部变量设置为en_US.UTF-8)来获得该结果?

我正在使用

 sort 5.93                        November 2005

 $ type sort
 sort is /usr/bin/sort
Run Code Online (Sandbox Code Playgroud)

UPDATE

我已经在gnu-coreutils列表上讨论了这个问题,现在明白为什么使用英语unicode默认语言环境设置进行排序可以得到输出.因为在英文unicode中,逗号字符","被认为是数字(以便允许逗号为千位(或例如数百)分隔符),并且在解释一行时将默认值排序为"贪婪",它会读取示例数字约为

581.491...
590.000...
590.001...
591.492...
600.001...
601.492...
1213.08...
1214.15...
1226.76... …
Run Code Online (Sandbox Code Playgroud)

unix csv sorting locale

5
推荐指数
1
解决办法
1585
查看次数

标签 统计

unix ×4

sorting ×3

bash ×1

csv ×1

gnu-sort ×1

ksh ×1

locale ×1