强制linux排序使用字典顺序

时间:2018-07-24 16:41:24

标签: linux bash sorting gnu

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

-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

2 个答案:

答案 0 :(得分:5)

sort命令考虑了您的语言环境设置。许多语言环境都会忽略破折号来进行排序。

您可以使用进行适当的排序

LC_COLLATE=C sort filename

答案 1 :(得分:1)

借助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 

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