排序命令给出意外输出

sort command giving unexpected output

我有两个文件,列中的字符串相同但顺序不同。

文件测试 1:

testbench.clk1 667 
testbench.clk1_temp_net 667 
testbench.clk 2000

文件测试2:

testbench.clk1 533 
testbench.clk 1611     
testbench.clk1_temp_net 538

I 运行 对两个文件的第 1 列排序命令如下,它给出不同的输出:

sort -t " " -k1 test1

testbench.clk1 667
testbench.clk1_temp_net 667
testbench.clk 2000

sort -t " " -k1 test2

testbench.clk1 533
testbench.clk 1611
testbench.clk1_temp_net 538

你能解释一下为什么我会得到这个输出吗?正确的解决方案是什么?

来自info sort

Many options affect how ‘sort’ compares lines; if the results are unexpected, try the ‘--debug’ option to see what happened.

让我们这样做(在我的 de_DE.utf8 系统上)

sort --debug -k1 file1
sort: es werden die Sortierregeln für »de_DE.utf8“ verwendet
sort: führende Leerzeichen sind signifikant in Schlüssel 1: Sie sollten daher wahrscheinlich auch „b“ angeben

不幸的是,运行 英文命令无法显示发生的情况。要翻译它:

sort: sorting rules for »de_DE.utf8“ in use
sort: preceding whitspace is significant in key 1: You might want to use „b“

当我 运行 使用以下命令时:

LANG=C sort -k1b file1

可以只是

LANG=C sort -b file1

订单看起来没问题。我想这对你来说也是一个语言环境问题。


顺便说一句,如果你想要分层排序字段 1,字段 2 然后使用:

LANG=C sort -k1,1b -k2,2n file

问题被标记为 ,但事实证明 OP 使用的是 csh。在这种情况下,您需要像这样传递 $LANG

env LANG=C sort ...

要正确排序,您需要指定键,您将根据这些键对列表中的第一列和第二列进行排序。

sort -k1,1 -k2,2 test1

testbench.clk 2000
testbench.clk1 667
testbench.clk1_temp_net 667

和文件 2

sort -k1,1 -k2,2 test2

testbench.clk 1611
testbench.clk1 533
testbench.clk1_temp_net 538

如果您像以前一样只使用 -k1,那么它将使用第一个键直到行尾 - 这与默认排序相同。问题是,显然 sort 将数字之间的空格视为千位分隔符,就像在某些语言中一样。这使得 testbench.clk 1611 变成 testbench.clk1611 并且 testbench.clk1 533 变成 testbench.clk1533 即使不使用数字排序。

不需要弄乱 LANG 或 LC_COLLATE 变量。这样做可能会导致您的排序对某些语言产生错误的结果。例如。捷克语和许多其他语言中使用的字符 č 将被错误排序。