Sorting 只有在第二列存在时,Unix排序才会发出超出预期顺序的行

Sorting 只有在第二列存在时,Unix排序才会发出超出预期顺序的行,sorting,unix,gnu,gnu-sort,Sorting,Unix,Gnu,Gnu Sort,我有一个有两列的文件。第一列中有两个下划线分隔的数字,我想按此列对文件进行词汇排序。现在,如果没有第二列,默认排序正是我想要的: $ { echo 211_284; for ((i=2840;i<=2842;++i)); do echo 211_$i; done; echo 211_284; } | sort -k1 211_284 211_284 211_2840 211_2841 211_2842 ${echo 211_284;for((i=2840;i如果要忽略除第一列以外的任何内

我有一个有两列的文件。第一列中有两个下划线分隔的数字,我想按此列对文件进行词汇排序。现在,如果没有第二列,默认排序正是我想要的:

$ { echo 211_284; for ((i=2840;i<=2842;++i)); do echo 211_$i; done; echo 211_284; } | sort -k1
211_284
211_284
211_2840
211_2841
211_2842

${echo 211_284;for((i=2840;i如果要忽略除第一列以外的任何内容,请使用
排序-k1,1
;否则,指定的是起始列,而不是结束列:

此外,如果您不希望区域设置的排序顺序影响数字和空格之间的词汇排序关系,请显式设置
LC\u ALL=C
(或者更狭义地说,
LC\u COLLATE=C

${echo 211_284 X;for((i=2840;i | LC_ALL=C排序-k1,1
211_284 X
211_284 Z
211_2840 Y
211_2841 Y
211_2842 Y

这是在使用GNU排序,而不是在bash中进行本机排序。这很好——在bash中进行本机排序是愚蠢的——但这意味着你的问题是关于标准UNIX工具,而不是关于bash,因此应该用不同的标记。@CharlesDuffy不熟悉要使用的正确标记。抛出了一堆,feel可以自由编辑任何有意义的内容。我无法复制结果。您的第二个示例使用
sort(GNU coreutils)对我来说是正确的8.23
。这给出了完全相同的输出-211_284行是最后一行而不是第一行。CNR。你的LC_比较值是多少?你的区域设置?@Barry,…如果你想完全确定本地化设置不起作用,我建议设置
LC_ALL=C
。要清楚,这需要在环境中,即使用
export
,或在sort命令本身(
…|LC_ALL=C sort-k1,1
)上完成。需要明确的是:您的区域设置决定排序顺序,排序顺序决定(除其他外)在lexographic排序中空格与数字的关系。
$ { echo 211_284 X; for ((i=2840;i<=2842;++i)); do echo 211_$i Y; done; echo 211_284 Z; } | sort -k1
211_2840 Y
211_2841 Y
211_2842 Y
211_284 X
211_284 Z
$ { echo 211_284 X; for ((i=2840;i<=2842;++i)); do echo 211_$i; done; echo 211_284; } | sort -k1
211_284
211_2840
211_2841
211_2842
211_284 X
$ { echo 211_284 X; for ((i=2840;i<=2842;++i)); do echo 211_$i Y; done; echo 211_284 Z; } \
>   | LC_ALL=C sort -k1,1
211_284 X
211_284 Z
211_2840 Y
211_2841 Y
211_2842 Y