gpt4 book ai didi

linux - 试图了解 linux 中的排序实用程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:01 26 4
gpt4 key购买 nike

我有一个名为 a.csv 的文件。其中包含

100008,3
10000,3
100010,5
100010,4
10001,6
100021,7

运行此命令后 sort -k1 -d -t ","a.csv

结果是

10000,3
100008,3
100010,4
100010,5
10001,6
100021,7

这是出乎意料的,因为 10001 应该比 100010 先出现

试图理解为什么会发生这种情况。但无法得到任何答案。

$ sort --version
sort (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and Paul Eggert.

最佳答案

其他一些回复假设这是数字排序与字典排序的问题。事实并非如此,因为即使按字母顺序排序,问题中给出的输出也不正确。

答案

要获得正确的排序,需要将-k1更改为-k1,1:

$ sort -k1,1 -d -t "," a.csv
10000,3
100008,3
10001,6
100010,4
100010,5
100021,7

原因

-k 选项需要两个数字,开始和结束字段进行排序(即 -ks,e 其中 s 是开始e 是结尾)。默认情况下,结束字段是行的结尾。因此,-k1 等同于根本不提供 -k 选项。为了证明这一点,比较:

$ printf "1,a,1\n2,aa,2\n" | sort -k2 -t,
1,a,1
2,aa,2

与:

$ printf "1~a~1\n2~aa~2\n" | sort -k2 -t~
2~aa~2
1~a~1

第一个将 a,1 排在 aa,2 之前,而第二个将 aa~2 排在 a~1 因为在 ASCII 中,, <a <~.

因此,为了获得所需的行为,我们需要 对一个字段进行排序。在您的情况下,这意味着使用 1 作为开始和结束字段,因此您指定 -k1,1。如果您使用 -k2,2 而不是 -k2 尝试上面的两个示例,您会发现在这两种情况下您得到相同(正确)的排序。

非常感谢来自 coreutils 邮件列表的 Eric 和 Assaf 指出了这一点。

关于linux - 试图了解 linux 中的排序实用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34134677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com