以数字方式对每个字段进行排序,不同的字段计数

Joe*_*eid 7 text-processing sort

我正在尝试使用sort. 我注意到它是按数字而不是数字排序的,所以我添加了-n标志。不过,它似乎只是在第一个字段上进行数字排序。按字段分解它是一个问题,因为这些行具有不同数量的字段(坦率地说,我无法理解它的行为)。这是我正在使用的一些足够接近的示例数据:

echo -e "b b 1\n23 44\nb 3\na 7\nb b 2\na 1\nb a 10\nb b 10\nb 1\nb a 1\n18 2\nb 10\n18 15\nb a 2\n23 9\nb 2" | sort -n

Input     Want      Expect?   sort      -n        -n -k1,1 -k2,2 -k3,3 -k4,4…

b b 1     8 2       a 1       23 44     a 1       b a 1
23 44     8 15      a 7       23 9      a 7       b a 10
b 3       23 9      b a 1     8 15      b 1       b a 2
a 7       23 44     b a 2     8 2       b 10      b b 1
b b 2     a 1       b a 10    a 1       b 2       b b 10
a 1       a 7       b b 1     a 7       b 3       b b 2
b a 10    b 1       b b 2     b 1       b a 1     a 1
b b 10    b 2       b b 10    b 10      b a 10    b 1
b 1       b 3       b 1       b 2       b a 2     b 2
b a 1     b 10      b 2       b 3       b b 1     b 3
8 2       b a 1     b 3       b a 1     b b 10    a 7
b 10      b a 2     b 10      b a 10    b b 2     b 10
8 15      b a 10    8 2       b a 2     8 15      8 2
b a 2     b b 1     8 15      b b 1     8 2       8 15
23 9      b b 2     23 9      b b 10    23 44     23 9
b 2       b b 10    23 44     b b 2     23 9      23 44
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想让它在具有 GNU coreutils 排序 5.93 的那台机器上运行。我想用简单的 unix 工具来处理它;我不想只是把问题交给 perl 等。我希望有一个相当于 [虚构]sort --numeric-sort --all-fields --actually-work

Arc*_*ege 7

我认为你的问题是你不明白sort在做什么。基本排序基于 ASCII 字符值,其中数字在大写字母之前,小写字母之前:'1' == 49, 'A' == 65, 'a' = 97. 这解释了sort列,其中数字如 '23 ' 排在 '8 ' 之前,也就是 'b b' 之前:'2' 的 ASCII 值是 50,'8' 的 ASCII 值是 56,'b' 的 ASCII 值是 98。

当按数字 ( sort -n)排序时,非数字条目按常规方法排序,但与数字(如 23 或 8)相比时解释为零;但由于该值被视为数字,而不是字符值,因此“8”在“23”之前。所以字母条目将在数字条目之前排序。

最好的办法是对数据进行规范化,使每一列都具有相同类型的值:全部为数字或全部为字母数字,并进行适当的排序。

在最后一列(按字段排序)中,它将首先对具有更多字段的条目进行排序,因为您明确指定了 4 个(或更多)字段。所以 (1,2,3) 会在 (1,2) 之前。如果没有该-k选项,则 sort 会将整行考虑在内。

您可以在info coreutils 排序页面上阅读更多信息。


ilk*_*chu 1

经过几年的发展,sort -Vonsort 8.26产生了所需的输出:

$ echo -e "b b 1\n23 44\nb 3\na 7\nb b 2\na 1\nb a 10\nb b 10\nb 1\nb a 1\n8 2\nb 10\n8 15\nb a 2\n23 9\nb 2" \
   | sort -V
8 2
8 15
23 9
23 44
a 1
a 7
b 1
b 2
b 3
b 10
b a 1
b a 2
b a 10
b b 1
b b 2
b b 10
Run Code Online (Sandbox Code Playgroud)