排序命令给出意外输出
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
问题被标记为 bash,但事实证明 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 变量。这样做可能会导致您的排序对某些语言产生错误的结果。例如。捷克语和许多其他语言中使用的字符 č
将被错误排序。
我有两个文件,列中的字符串相同但顺序不同。
文件测试 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
问题被标记为 bash,但事实证明 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 变量。这样做可能会导致您的排序对某些语言产生错误的结果。例如。捷克语和许多其他语言中使用的字符 č
将被错误排序。