处理一些数据后,我得到一个文件,其中包含一定数量的数据点——每行一个。我需要将这些数据点传递给另一个工具,该工具将进行更多的数字运算——在该工具中,我需要为给定的运行设置“批量大小”:
./gen_data.sh > data.txt
./process_data.sh < data.txt > parsed.bin
./crunch_data.sh --total=$(wc -l < data.txt) --batch_size=N --infile=parsed.bin
批量大小N
太小将需要很长的时间来处理;批量大小太大会给我带来低质量的输出。批量大小必须除以数据点的数量,由 给出M=$(wc -l < data.txt)
。N
周围的价值观M/10
似乎还不错。如果批量大小在奇怪的情况下做了一些奇怪的事情(即N=M
对于素数M
——这种情况几乎肯定不会发生,所以我不担心它),那也没什么大不了的。
有没有一种巧妙的方法可以使用 shell 工具来做到这一点?我知道我可以得到M
with的因数factor
。在Python中我可能会写这样的东西:
total_portion = 1
for factor in factors(M):
total_portion *= factor
if total_portion > 10:
return M/total_portion
现在我得到的分数M
比 1/10 小一点,具体取决于M
有多少因素。
我不确定如何将其作为 shell 脚本来完成,或者我可以使用什么工具来使其更容易。这件事能做得很好吗?我是否最好将因素列表传递给一个小型 Python 脚本并在那里执行逻辑?
答案1
这是使用 GNU 的 python 算法的 shell 版本factor
:
#! /bin/bash
function total_portion() {
local M="$1"
local total_portion=1
for factor in $(factor "$M" | sed -e 's/^[0-9]\+: //'); do
((total_portion *= factor))
if [ "$total_portion" -gt 10 ] ; then
echo $((M / total_portion))
return
fi
done
}
M=$(wc -l < data.txt)
tp=$(total_portion "$M")