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

时间:2015-10-27 15:41:10

标签: 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 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

如何对第一列进行排序?

1 个答案:

答案 0 :(得分:2)

如果您想忽略第一列以外的任何内容,请使用sort -k1,1;否则,您指定了一个起始列,但没有指定结束列:

此外,如果您不希望您的区域设置排序顺序影响数字和空格之间的排版关系排序关系,请明确设置LC_ALL=C(或者更简单地设置LC_COLLATE=C )。

$ { 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