0

今、ソートコマンドパラメータを使用せずに降順ソートを実行したいので、1つの方法を考えて、すべての値を-1の倍数にすると、最大値が最小になり、最小値が最大になります.そして、ソートコマンドはコマンドパラメータが追加されていない場合、最初の値。したがって、フォーマット値を出力し、すべての値が同じビットを持つようにします。この方法はマップリデュースに使用されます。マッパーコード:

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 の最後の行は以下のように表示されます。sort コマンドがマイナスを考慮していないようです。どうすれば修正できますか?

-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

sortwith no options は字句的にソートされます。単純に数値ではなく文字列として扱われるため、-2before もそうです。それを修正するために-3使用するか、読み進めてください。sort -n

上限値 (最初の列が取り得る最大値) がある場合は、そこから差し引くことができます。パイプラインで追加の演算を避けるために、これをプレフィックスとして追加し、並べ替え後にそれを取り除くことができます ( Schwartzian transformも参照してください)。

最大値が 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 に答える