我正在嘗試重寫一些我認爲效率很低(更不用說不雅)的舊bash腳本,並使用一些可怕的管道......也許某些有真正Python技能的人可以給我一些指點...python文件操作(bash腳本移植)
這個腳本的多個臨時文件的用途......另一件事我認爲這是一個糟糕的風格,也許可以避免......
它基本上是由第一切割出一定的操縱INPUT-FILE
頂部的行數(丟棄標題)。
然後翻出的一列和:
- 的
raws = N
計算數目; - 從此單個列文件中拋出所有重複條目(我使用
sort -u -n FILE > S-FILE
)。
之後,我創建一個從1到N的順序整數索引,並使用paste命令將此新索引列粘貼到原始的INPUT-FILE
中。
我的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 500線-FILE其中第4列中的值大於2000並將其寫入文件2000- $ INPUT-FILE
- 對於$ INPUT-FILE中的所有REMAINING行,隨機選擇500行,其中列4中的值大於1000,並且把它寫出來到文件1000- $ I NPUT-FILE
- 對於1後在$ INPUT-FILE所有剩餘的線)和2)中,隨機選擇500行,其中在第4列值大於500並寫入到文件500- $ INPUT-FILE
同樣,我希望有人能夠幫助我將這個醜陋的管道變成一件蟒蛇之美! :) 謝謝!評價
你可以從文件中添加一個示例行,以及從命令行調用此腳本的示例嗎? – 2013-03-25 22:14:20
請在發佈之前查看帖子預覽,並確保避免文字牆。它只會讓你的問題被忽略,因爲它很難破譯所說的話。 – Serdalis 2013-03-25 22:14:27
一些圖書館看:'tempfile','difflib''隨機' – monkut 2013-03-25 22:16:31