我正在尝试重写一些我认为非常低效(更不用说不优雅)的旧 bash 脚本并使用一些可怕的管道......也许具有真正 Python 技能的人可以给我一些指示......
该脚本使用多个临时文件......我认为另一件事是一种糟糕的风格,可能可以避免......
它本质上是INPUT-FILE
通过首先从顶部剪掉一定数量的行(丢弃标题)来进行操作的。
然后它拉出其中一列并:
- 计算数量
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 中的所有 REMAINING 行,随机选择第 4 列中的值大于 1000 的 500 行并将其写入文件 1000-$INPUT-FILE
- 对于 1) 和 2) 之后 $INPUT-FILE 中的所有 REMAINING 行,随机选择第 4 列中的值大于 500 的 500 行并将其写入文件 500-$INPUT-FILE
再一次,我希望有人能帮助我把这个丑陋的管道改造成蟒蛇之美!:) 谢谢!