UNIX排序命令

时间:2015-09-25 09:24:56

标签: sorting unix

我需要对文件中的数据进行排序。排序顺序是第7,2列。最后一列(第8列)为空:

    1|1|1|1|1|1|12333|    
    3|3|3|3|3|3|44454|    
    2|2|2|2|2|2|22222|    
    1|1|1|1|1|1|123300000|    

当我使用以下命令时,我在输出文件中得到一个奇怪的值:

sort -o /test1/FILE2 -T /test1/Junk -t\| -k7,7 -k2,2 /test1/Junk/FILE2_1  

其中

  • /test1/FILE2是输入文件
  • /test1/Junk是临时目录
  • /test1/Junk/FILE2_1是输出文件

输出文件中的值

    1|1|1|1|1|1|123300000|    
    1|1|1|1|1|1|12333|    
    2|2|2|2|2|2|22222|    
    3|3|3|3|3|3|44454|    

知道为什么包含123300000的行会先出现吗?

我需要如下排序​​:

    1|1|1|1|1|1|12333|    
    1|1|1|1|1|1|123300000|    
    2|2|2|2|2|2|22222|    
    3|3|3|3|3|3|44454|    

2 个答案:

答案 0 :(得分:4)

通常,您选择数字或词典(字典)排序。

如果您希望这些值按数字排序,则-n命令中需要sort

pax> echo '1|1|1|1|1|1|12333|    
3|3|3|3|3|3|44454|    
2|2|2|2|2|2|22222|    
1|1|1|1|1|1|123300000|' | sort -t \| -k7,7 -k2,2 -n

1|1|1|1|1|1|12333|    
2|2|2|2|2|2|22222|    
3|3|3|3|3|3|44454|    
1|1|1|1|1|1|123300000|

另一方面,如果您没有想要按数字排序,那么您所拥有的输出已经正确,据我所知:

                v
1|1|1|1|1|1|123300000|    
1|1|1|1|1|1|12333|    
                ^

注意突出显示的字符。由于0位于3之前,因此这是正确的字典顺序。

将该较大的值更改为123330000会产生您似乎遵循的顺序:

pax> echo '1|1|1|1|1|1|12333|    
3|3|3|3|3|3|44454|    
2|2|2|2|2|2|22222|    
1|1|1|1|1|1|123330000|' | sort -t \| -k7,7 -k2,2

1|1|1|1|1|1|12333|    
1|1|1|1|1|1|123330000|
2|2|2|2|2|2|22222|    
3|3|3|3|3|3|44454|   

因此我怀疑你在这种情况下误读了数据。

如果您在评论中说明测试数据不正确,则最终|字符的存在与否应该对排序顺序没有影响。首先,使用和不使用|进行词典排序:

pax> echo ; echo '1|1|1|1|1|1|12333|
3|3|3|3|3|3|44454|
2|2|2|2|2|2|22222|
1|1|1|1|1|1|123330000|' | sort -t \| -k7,7 -k2,2

1|1|1|1|1|1|12333|
1|1|1|1|1|1|123330000|
2|2|2|2|2|2|22222|
3|3|3|3|3|3|44454|

pax> echo ; echo '1|1|1|1|1|1|12333
3|3|3|3|3|3|44454
2|2|2|2|2|2|22222
1|1|1|1|1|1|123330000' | sort -t \| -k7,7 -k2,2

1|1|1|1|1|1|12333
1|1|1|1|1|1|123330000
2|2|2|2|2|2|22222
3|3|3|3|3|3|44454

你可以看到123330000在这两种情况下都是第二位。

同样,对于使用和不使用|的数字排序,最后会显示较大的数字:

pax> echo ; echo '1|1|1|1|1|1|12333| 
3|3|3|3|3|3|44454| 
2|2|2|2|2|2|22222| 
1|1|1|1|1|1|123330000|' | sort -t \| -k7,7 -k2,2 -n

1|1|1|1|1|1|12333|
2|2|2|2|2|2|22222|
3|3|3|3|3|3|44454|
1|1|1|1|1|1|123330000|

pax> echo ; echo '1|1|1|1|1|1|12333 
3|3|3|3|3|3|44454 
2|2|2|2|2|2|22222 
1|1|1|1|1|1|123330000' | sort -t \| -k7,7 -k2,2 -n

1|1|1|1|1|1|12333
2|2|2|2|2|2|22222
3|3|3|3|3|3|44454
1|1|1|1|1|1|123330000

如果您正在查看其他内容,那么您的排序会被破坏或者配置奇怪。您可能想要调查一下,如果是这种情况,您是否有sort函数或别名覆盖真实的函数(例如which sort),或者您是否有一个奇怪的{ {1}}设置,它影响用于排序的比较函数。

至少使用GNU排序,您还可以使用LC_ALL注释输出,指示哪些行部分用作键。

最后,另一种可能性是输入中存在可能影响排序顺序的非打印字符。您可以通过获取文件的十六进制转储并检查它来检测这些:

--debug

答案 1 :(得分:0)

如您所说,订购是按字典顺序进行的。您的命令几乎是正确的,但在排序命令中使用n,例如

3|3|3|3|3|3|44454|
2|2|2|2|2|2|22222|
1|1|1|1|1|1|123330000|' | sort -t \| -nk7,7 -nk2,2

This will sort the data numerically.