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

Jer*_*mes 4 sort

Linux 上的GNUsort没有对我的 csv 文件给出预期结果。您能帮忙解决这个情况/问题吗?

输入文件

[nscruser]$ cat cemp1.txt
10,30
50,900
20,1050
Run Code Online (Sandbox Code Playgroud)

目标我需要对上述文件的第一个字段进行数字排序

[nscruser]$  sort -t',' -k1 -n cemp1.txt
10,30
50,900
20,1050
Run Code Online (Sandbox Code Playgroud)

预期输出但我预期输出如下,因为我正在对第一列进行数字排序

10,30
20,1050
50,900
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我为什么会出现差异吗?

Dar*_*idl 6

查看sort(来自 GNU coreutils 8.32)的手册页,

\n
\n

-k, --key=KEYDEF\n通过键排序;KEYDEF 给出位置和类型

\n

...

\n

KEYDEF 是 F[.C][OPTS][,F[.C][OPTS]] 表示开始和停止位置,其中 F 是字段编号,C 是字段中的字符位置;\n两者都是起始位置 1,并且停止位置默认为行尾。如果 -t 和 -b 均无效,则字段中的字符\n从前面的空格的开头开始计数。OPTS 是一个或多个单字母排序选项 [bdfgiMhnRrV],\n它优于\xe2\x80\x90\n该键的全局排序选项。如果未给出键,则使用整行作为键。使用 --debug 来诊断\不正确的密钥\使用情况。

\n
\n

首先,您可以--debug按照建议使用,

\n
$ sort -t',' -k1 -n --debug cemp1.txt\nsort: text ordering performed using \xe2\x80\x98en_IE.UTF-8\xe2\x80\x99 sorting rules\nsort: key 1 is numeric and spans multiple fields\n10,30\n_____\n_____\n50,900\n______\n______\n20,1050\n_______\n_______\n\n
Run Code Online (Sandbox Code Playgroud)\n

这给了我们一个线索:“键 1 是数字并且跨越多个字段”。

\n

正如手册页所述,“停止位置默认为行尾”。所以需要添加一个停止位置:

\n
$ sort -t',' -k1,1 -n cemp1.txt\n10,30\n20,1050\n50,900\n
Run Code Online (Sandbox Code Playgroud)\n

  • 这似乎是 GNU `sort` 特有的。BSD 系统上的原生“sort”似乎没有这种怪癖。 (3认同)
  • ...另请参阅 [unix sort -n -t"," 给出意外结果](/sf/ask/1346027791/) (3认同)