我正在尝试对一些简单的管道分隔数据进行排序。但是,排序实际上并不是排序。它将我的标题行移动到底部,但是我以 241 开头的两行被以 24 开头的行分开。
cat sort_fail.csv
column_a|column_b|column_c
241|212|20810378
24|121|2810172
241|213|20810376
sort sort_fail.csv
241|212|20810378
24|121|2810172
241|213|20810376
column_a|column_b|column_c
列标题被移到文件的底部,因此 sort 显然正在处理它。但是,实际值并没有像我期望的那样排序。
在这种情况下,我解决了它
sort sort_fail.csv --field-separator='|' -k1,1
但是,我觉得这不应该是必要的。为什么排序不排序?
sort
是区域设置感知的,因此根据您的 LC_COLLATE 设置(从 LANG 继承),您可能会得到不同的结果:这可能会导致脚本出现问题,因为您可能不知道调用区域设置为什么,因此可能会得到不同的结果。
脚本强制设置所需的设置并不少见
例如
现在有趣的是,这个
|
角色看起来很奇怪。但这是因为源自 ISO 的 en_US 的默认规则说
这意味着该
|
字符被忽略并且排序顺序就像该字符不存在一样..这与您看到的“意外”排序相匹配。
解决方法是使用
-n
(强制数字排序),或使用字段分隔符(如您所做的那样)或使用C
语言环境。让我恼火的是
24
不会从两者之间的位置移动241
。第二个字段以1
.4
尝试在第二个字段中领先的排序,24
将向下移动,所以我怀疑sort
只是忽略了,|
除非另有说明。试sort -n
...-n, --numeric-sort 根据字符串数值进行比较
如果没有 -n,文本中的 210 将领先于 23,因为它代表了我的角色。