我需要对文件中的数据进行排序。排序顺序是第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|
答案 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.