【发布时间】:2013-03-25 22:05:39
【问题描述】:
我正在尝试重写一些我认为非常低效(更不用说不优雅)的旧 bash 脚本并使用一些可怕的管道......也许有真正 Python 技能的人可以给我一些指示......
该脚本使用多个临时文件...我认为另一件事是一种不好的风格,可能可以避免...
它本质上是通过首先从顶部剪掉一定数量的行(丢弃标题)来操纵INPUT-FILE。
然后它拉出其中一列并:
- 计算
raws = N的数量; - 从这个单列文件中丢弃所有重复的条目(我使用
sort -u -n FILE > S-FILE)。
之后,我创建了一个从 1 到 N 的连续整数索引,并使用粘贴命令将此新索引列粘贴到原始 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-FILE 中随机选择 500 行,其中第 4 列中的值大于 2000,并将其写入文件 2000-$INPUT-FILE
- 对于 $INPUT-FILE 中的所有 REMAINING 行,随机选择第 4 列中的值大于 1000 的 500 行并将其写入文件 1000-$INPUT-FILE
- 对于 1) 和 2) 之后 $INPUT-FILE 中的所有 REMAINING 行,随机选择第 4 列中的值大于 500 的 500 行并将其写入文件 500-$INPUT-FILE
再次,我希望有人可以帮助我将这个丑陋的管道东西改造成蟒蛇之美! :) 谢谢!
【问题讨论】:
-
您能否从文件中添加一个示例行以及您从命令行调用此脚本的示例?
-
发帖前请先查看帖子预览,并确保避开文字墙。它只会让你的问题被忽略,因为它很难破译所说的内容。
-
一些要查看的库:
tempfile,difflibrandom -
正如 Serdalis 所提到的,这是相当广泛的。您最好开始着手并将其分解为多个部分,在遇到问题时提出问题。
-
@Serdalis 感谢您主持我的帖子,先生!我同意,这有点罗嗦......只是试图为问题的实际内容提供一个一般背景,以“在此之后,它进入下面的丑陋......”开始。这是我很想重写的主要部分。其他事情都相当琐碎......