0

现在我想在不使用任何排序命令参数的情况下进行降序排序。所以我想出了一种方法,让每个值倍数 -1,最大值为最小值,最小值为最大值。然后因为排序命令是由第一个值,如果没有添加任何命令参数。所以我打印格式值,让每个值都有相同的位。这种方式将用于 map-reduce。映射器代码:

import sys
import re
for line in sys.stdin:
    adver_num=0
    line=line.strip()
    words=line.split('\t')
    adver_num= (-1)*(int(words[0]))
    print"%09.0f\t%s\t%s"%(adver_num,words[1],words[2])

然后 cat a.log|python mapper.py|sort > b.log。而b.log,似乎负数仍然不起作用。

b.log 中的最后一行如下所示。排序命令似乎没有考虑缺点。我该如何解决?

-00026844
-00027621
-00029789
-00029848
-00030789
-00032120
-00034452
-00034458
-00037064
-00038644
4

2 回答 2

1

您可以使用该sorted(iterable, cmp=None, key=None, reverse=False)功能。您可以在此处找到详细信息:http: //docs.python.org/2/library/functions.html#sorted

于 2013-08-23T09:21:05.647 回答
0

sort没有选项将按词法排序,-2之前也是如此,-3因为它们被视为字符串,而不是数字。用来sort -n解决这个问题,或继续阅读。

如果您有一个上限(第一列可以采用的最高最大值),那么您可以从中减去。为了避免管道中的额外算术,您可以将其添加为前缀,然后在排序后将其剥离(另请参见Schwartzian 变换)。

假设最大值永远不会超过 10,000,000。然后您可以将其规定为理论最大值,并执行类似的操作

import sys
import re
ceiling=10000000
for line in sys.stdin:
    line=line.strip()
    words=line.split('\t')
    sortkey=ceiling-int(words[0])
    print "%09.0f\t%s\t%s\t%s" % (sortkey, words[0],words[1],words[2])

然后你可以在排序后去掉第一列。

python a.py <a.log | sort | cut -f2- >a.out

如果您对将整个数据集读入内存感到满意(就像在@ViktorKerkez 的回答中一样),那么您很容易拥有可用的最大值,并且可以将其用作上限。这有一个明显的缺点,即您无法处理不适合内存的数据集(并且由于交换,不适合物理内存的数据集处理起来会非常慢)。

于 2013-08-24T09:12:28.110 回答