我正在尝试重写一些我认为效率很低(更不用说不雅)的旧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