“sort -s”认为“p”出现在“d”之前?

时间:2013-12-11 17:14:50

标签: sorting

> echo "fdp.txtUNE/ser/redaeR/daerorca/bil/rsu\nf.dpu" | sort -s 
fdp.txtUNE/ser/redaeR/daerorca/bil/rsu 
f.dpu 

自“。”默认情况下不是字段分隔字符,前3个 人物似乎说:

  • f< = f(没关系)

  • d< =。 (用ASCII,“。”<“d”,但我可以用排序决定字母 在标点符号之前)

  • p< = d(这是有问题的)

更糟糕的是,如果我从第二个字符串中删除一个字母,结果 相反:

> echo "fdp.txtUNE/ser/redaeR/daerorca/bil/rsu\nf.dp" | sort -s 
f.dp 
fdp.txtUNE/ser/redaeR/daerorca/bil/rsu 

这里有什么可怕的东西,我该如何阻止呢?我以为“-s” 就足够了,但显然不是。

据我所知,'sort'认为“f.dpu”> “fdp.t”因为“你”> “T”。但是,永远不应该进行这种比较,因为之前的字符已经不同了。

作为一个注释,我在没有“-s”的情况下得到相同的结果。

编辑:将环境变量LC_ALL设置为“C”修复此问题,但仍然让我感到困惑的是,将LC_ALL(语言环境)留空会产生不一致的结果(不同是好的,不一致是坏的)。

1 个答案:

答案 0 :(得分:1)

首先,我必须打开扩展的回声:

$ shopt -s xpg_echo

现在,我会按你的意思运行:

BASH 3.2:$ echo "fdp.txtUNE/ser/redaeR/daerorca/bil/rsu\nf.dpu" | sort -s
f.dpu
fdp.txtUNE/ser/redaeR/daerorca/bil/rsu

这是.d之前排序的正确排序顺序,因此f.dpu应该排在第一位。

我没有得到你的结果。可能是因为我使用的是Mac OS X而不是Linux。但是,两者上的-s选项都表示“通过禁用最后的比较来稳定排序”。它们是否设置了可能导致这些问题的其他shell选项?

这是我的shopt设置:

$ shopt
cdable_vars     off
cdspell         off
checkhash       off
checkwinsize    on
cmdhist         on
compat31        off
dotglob         off
execfail        off
expand_aliases  on
extdebug        off
extglob         on
extquote        on
failglob        off
force_fignore   on
gnu_errfmt      off
histappend      off
histreedit      off
histverify      off
hostcomplete    on
huponexit       off
interactive_comments    on
lithist         on
login_shell     off
mailwarn        off
no_empty_cmd_completion off
nocaseglob      off
nocasematch     off
nullglob        off
progcomp        on
promptvars      on
restricted_shell    off
shift_verbose   off
sourcepath      on
xpg_echo        on

与我默认的三个不同之处是exgloblithistxpg_echo,我只是为了让它发挥作用而设置。

你能想到其他可能发生的事情吗?