私は、非常に非効率的であると思う古いbashスクリプトのいくつかを書き直して(エレガントではないことは言うまでもなく)、恐ろしい配管を使用しようとしています...おそらく、実際のPythonスキルを持っている人が私にいくつかのポインターを与えることができます...
スクリプトは複数の一時ファイルを使用します...私が思うもう1つのことは悪いスタイルであり、おそらく回避することができます...
基本的INPUT-FILE
に、最初に上から特定の数の行を切り取る(見出しを破棄する)ことによって操作します。
次に、列の1つを引き出し、次のようにします。
- の数を計算し
raws = N
ます。 - この単一の列ファイルからすべての重複エントリをスローします(私はを使用します
sort -u -n FILE > S-FILE
)。
その後、1からNまでの順次整数インデックスを作成し、INPUT-FILE
pasteコマンドを使用してこの新しいインデックス列を元のインデックス列に貼り付けます。
次に、bashスクリプトは、S-FILEに書き込んだ値のパーセンタイルランクを生成します。
Pythonはを活用していると思いますscipy.stats
が、bashでは、S-FILEの一意のエントリごとに重複行(dupline)の数を決定し、計算しますper-rank=$((100*($counter+$dupline/2)/$length))
。ここで、$ length = FILEの長さであり、S-FILEではありません。次に、結果を別の1列のファイルに出力します(そして、重複する回数だけ同じランクごとに繰り返します)。
次に、パーセンタイルランクのこの新しい列をINPUT-FILEに貼り付けます(パーセンタイルランクの計算に使用される列でINPUT-FILEを並べ替えるため、結果にはすべてが完全に一致します)。
この後、それは以下の醜さになります...
sort -o $INPUT-FILE $INPUT-FILE
awk 'int($4)>2000' $INPUT-FILE | awk -v seed=$RANDOM 'BEGIN{srand(seed);} {print rand()"\t"$0}' | sort -k1 -k2 -n | cut -f2- | head -n 500 > 2000-$INPUT-FILE
diff $INPUT-FILE 2000-$INPUT-FILE | sed '/^[0-9][0-9]*/d; s/^. //; /^---$/d' | awk 'int($4)>1000' | awk -v seed=$RANDOM 'BEGIN{srand(seed);} {print rand()"\t"$0}' | sort -k1 -k2 -n | cut -f2- | head -n 500 > 1000-$INPUT-FILE
cat 2000-$INPUT-FILE 1000-$INPUT-FILE | sort > merge-$INPUT-FILE
diff merge-$INPUT-FILE $INPUT-FILE | sed '/^[0-9][0-9]*/d; s/^. //; /^---$/d' | awk 'int($4)>500' | awk -v seed=$RANDOM 'BEGIN{srand(seed);} {print rand()"\t"$0}' | sort -k1 -k2 -n | cut -f2- | head -n 500 > 500-$INPUT-FILE
rm merge-$INPUT-FILE
基本的に、これは次のことを行うための非常にエレガントでないbashの方法です。
- $ INPUT-FILEから500行をランダムに選択し、列4の値が2000より大きい場合は、ファイル2000-$INPUT-FILEに書き込みます。
- $ INPUT-FILEの残りのすべての行について、列4の値が1000より大きい500行をランダムに選択し、ファイル1000-$INPUT-FILEに書き込みます。
- 1)および2)の後の$ INPUT-FILEの残りのすべての行について、列4の値が500より大きい500行をランダムに選択し、ファイル500-$INPUT-FILEに書き込みます。
繰り返しになりますが、誰かがこの醜い配管をPythonの美しさのものに作り直すのを手伝ってくれることを願っています!:) ありがとう!