Linux新手在这里和第一篇文章。请原谅我的不清晰。
我认为这是一个简单的最小值问题,两种不同的方法之间存在差异:按文件唤醒文件并使用通配符进行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分钟才能完成。我知道循环遍历这些文件会花费更多时间,但为什么使用通配符会导致任务失败?
答案 0 :(得分:0)
您的awk脚本可能正在为每个min
值执行字符串而不是数字比较,尤其是因为脚本中的第一个语句显式是字符串比较。要强制数字,请将其更改为:
awk 'min=="" || $2 < min+0 {min=$2} END{print min}' */myfile.10*
Awk将所有输入视为数字字符串类型,这是第一次允许awk确定它实际上是数字还是字符串时使用该输入的方式。
答案 1 :(得分:0)
我不确定您为什么会收到您提到的差异,但我建议您使用sort
来解决此问题:
sort -n -k2 */myfile.10*
使用第二列作为键执行数字排序。 sort
将输出所有文件中的所有行,因此您可以使用awk仅打印您感兴趣的值:
sort -n -k2 */myfile.10* | awk 'NR==1 {print $2; exit}'
将在第一行的第二列中打印该值,然后退出。