排序命令 - 数字排序不适用于 csv

排序命令 - 数字排序不适用于 csv

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

您可以尝试在命令前面加上LANGLC_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

相关内容