【问题标题】:force linux sort to use lexicographic order强制linux排序使用字典顺序
【发布时间】:2018-07-24 16:41:24
【问题描述】:

我生成了一个带有伪随机数的文本文件,如下所示:

-853340442 1130519212 -2070936922 
-707168664 -2076185735 -2135012102 
166464098 1928545126 5768715 
1060168276 -684694617 395859713 
-680897578 -2095893176 1457930442 
299309402 192205833 1878010157 
-678911642 2062673581 -1801057195 
795693402 -631504846 2117889796 
448959250 547707556 -1115929024 
168558507 7468411 1600190097 
-746131117 1557335455 73377787 
-1144524558 2143073647 -2044347857 
1862106004 -193937480 1596949168 
-1193502513 -920620244 -365340967 
-677065994 500654963 1031304603 

现在我尝试使用 linux sort 命令来整理它:

sort prng >prngsorted

结果不是我所期望的:

1060168276 -684694617 395859713 
-1144524558 2143073647 -2044347857 
-1193502513 -920620244 -365340967 
166464098 1928545126 5768715 
168558507 7468411 1600190097 
1862106004 -193937480 1596949168 
299309402 192205833 1878010157 
448959250 547707556 -1115929024 
-677065994 500654963 1031304603 
-678911642 2062673581 -1801057195 
-680897578 -2095893176 1457930442 
-707168664 -2076185735 -2135012102 
-746131117 1557335455 73377787 
795693402 -631504846 2117889796 
-853340442 1130519212 -2070936922 

显然,sort 尝试解析字符串并提取数字进行排序。而且它似乎忽略了减号。

是否可以强制sort 稍微笨一点,只按字典顺序比较行?结果应该是这样的:

-1144524558 2143073647 -2044347857 
-1193502513 -920620244 -365340967 
-677065994 500654963 1031304603 
-678911642 2062673581 -1801057195 
-680897578 -2095893176 1457930442 
-707168664 -2076185735 -2135012102 
-746131117 1557335455 73377787 
-853340442 1130519212 -2070936922 
1060168276 -684694617 395859713 
166464098 1928545126 5768715 
168558507 7468411 1600190097 
1862106004 -193937480 1596949168 
299309402 192205833 1878010157 
448959250 547707556 -1115929024 
795693402 -631504846 2117889796 

注意:我尝试了-d 选项,但没有帮助

注意 2:也许我应该使用另一个实用程序而不是 sort

【问题讨论】:

  • 看man,你有6种排序:general-numeric -g,human-numeric -h,month -M,numeric -n,random -R,version -V。尝试每一个,看看理想的输出是什么。
  • 这也可以在 serverfault 上找到:unix sort treats dash characters as invisible
  • 顺便说一句,如果你使用sort -n那么你会得到数字排序。默认行为是字典式,但(在您的语言环境中)忽略 - 符号。

标签: linux bash sorting gnu


【解决方案1】:

sort 命令会考虑您的区域设置。许多语言环境忽略了用于排序的破折号。

你可以得到适当的排序

LC_COLLATE=C sort filename

【讨论】:

  • 用于排序的手册页推荐 LC_ALL=C 但您的变体也可以使用
  • @igor.sol, LC_ALL 设置了一堆额外的东西,比如用于错误消息的语言。仅设置排序顺序是更好的做法,除非您确实打算产生这些副作用。
  • 这对我不起作用,但 LC_ALL=C 可以(因为我在我的环境中设置了 LC_ALL 并且它会覆盖所有内容)。因此,如果您只想要 LC_COLLATE,请取消设置 LC_ALL。
【解决方案2】:

awk的帮助下自定义排序

$ awk '{print ($1<0?"-":"+") "\t" $0}' file | sort -k1,1 -k2 | cut -f2-

-1144524558 2143073647 -2044347857 
-1193502513 -920620244 -365340967 
-677065994 500654963 1031304603 
-678911642 2062673581 -1801057195 
-680897578 -2095893176 1457930442 
-707168664 -2076185735 -2135012102 
-746131117 1557335455 73377787 
-853340442 1130519212 -2070936922 
1060168276 -684694617 395859713 
166464098 1928545126 5768715 
168558507 7468411 1600190097 
1862106004 -193937480 1596949168 
299309402 192205833 1878010157 
448959250 547707556 -1115929024 
795693402 -631504846 2117889796 

仅先按符号排序,然后进行常规排序并删除符号...

【讨论】:

  • 您是否在 OP 的初始结果可重现的语言环境中对此进行了测试?
  • 不!显然没有。
猜你喜欢
  • 2015-06-23
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2017-03-25
  • 2019-12-24
  • 1970-01-01
  • 2014-09-08
  • 2020-08-02
相关资源
最近更新 更多