Linux 上的GNUsort
没有对我的 csv 文件给出预期结果。您能帮忙解决这个情况/问题吗?
输入文件
[nscruser]$ cat cemp1.txt
10,30
50,900
20,1050
客观的我需要对上述文件的第一个字段进行数字排序
[nscruser]$ sort -t',' -k1 -n cemp1.txt
10,30
50,900
20,1050
预期产出但我期望输出如下,因为我正在对第一列进行数字排序
10,30
20,1050
50,900
有人可以告诉我为什么会出现差异吗?
答案1
查看sort
(来自 GNU coreutils 8.32)的手册页,
-k, --key=KEYDEF 通过键排序; KEYDEF 给出位置和类型
...
KEYDEF 是 F[.C][OPTS][,F[.C][OPTS]] 表示开始和停止位置,其中 F 是字段编号,C 是字段中的字符位置;两者都是原点 1,停止位置默认为线的末尾。如果 -t 和 -b 均无效,则字段中的字符从前面的空格的开头开始计数。 OPTS 是一个或多个单字母排序选项 [bdfgiMhnRrV],它覆盖该键的全局排序选项。如果未给出键,则使用整行作为键。使用 --debug 诊断不正确的密钥使用情况。
首先,您可以--debug
按照建议使用,
$ sort -t',' -k1 -n --debug cemp1.txt
sort: text ordering performed using ‘en_IE.UTF-8’ sorting rules
sort: key 1 is numeric and spans multiple fields
10,30
_____
_____
50,900
______
______
20,1050
_______
_______
这给了我们一个线索:“键 1 是数字并且跨越多个字段”。
正如手册页所述,“停止位置默认为行尾”。所以需要添加一个停止位置:
$ sort -t',' -k1,1 -n cemp1.txt
10,30
20,1050
50,900
答案2
您可以尝试在命令前面加上LANG
或LC_ALL
区域设置变量:
LANG=C sort -t',' -k1,1 -n cemp1.txt
或者
LC_ALL=C sort -t',' -k1,1 -n cemp1.txt
使用的变量取决于命令和/或操作系统版本。在 HP-UX 11.31 (Unix SYSTEM 5) 上:man 3C locale
解压
LANG LC_MESSAGES
LC_ALL LC_MONETARY
LC_COLLATE LC_NUMERIC
LC_CTYPE LC_TIME