【发布时间】:2014-06-09 04:51:20
【问题描述】:
Linux 新手在这里和第一篇文章。请原谅我不够清楚。
我认为这是一个简单的最小值问题,两种不同方法之间存在差异:逐个文件 awking 和使用通配符 awking。
我目前有大约 20,000 个文件(并且还在增长),我只想在第二列中找到总体最小值。这些文件都具有相同的前缀,并且位于执行脚本的下一级目录中,因此我使用通配符快速完成任务。
例子:
awk 'min=="" || $2 < min {min=$2} END{print min}' */myfile.10*
执行大约需要 14 秒,但它没有找到真正的最小值。
或者,我逐步浏览了每个目录的每个文件,我似乎找到了正确的最小值:
min=1000000000.0
for dir in `ls -d *run*/`; do
minlocal=1000000000.0
for file in `ls -1 ${dir}myfile.*`; do
for val in `awk 'NR==1 {print $2}' $genfile`; do
compare_result=`echo $minlocal" > "$val | bc`
if [ $compare_result -eq 1 ]; then
minlocal=$val
fileminlocal=$file
compare_result=`echo $min" > "$minlocal | bc`
if [ $compare_result -eq 1 ]; then
min=$val
filemin=$file
fi
fi
done
done
compare=`echo $min" > "$minlocal | bc`
if [ $compare -eq 1 ]; then
echo " Error finding lowest chi^2 in " $fileminlocal
echo " Skipping..."
else
echo " Lowest value (" $minlocal ")found in " $fileminlocal
fi
done
这种方法可以正确找到总体最小值,但需要 4 分钟。我知道遍历每个文件需要更多时间,但为什么使用通配符会导致任务失败?
【问题讨论】:
-
我对某个文件进行了测试,您的
awk确实有效。对我来说,它给出了正确的值。true minimum是什么意思?你可以重写一些:awk '!min || $2<min {min=$2;f=FILENAME} END{print min,f}'来获取文件名。 -
如果您没有回复,我们如何提供帮助?
-
感谢回复(我已经去睡觉了)。