最小值方法的差异

时间:2014-06-08 08:28:18

标签: awk minimum

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分钟才能完成。我知道循环遍历这些文件会花费更多时间,但为什么使用通配符会导致任务失败?

2 个答案:

答案 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}'

将在第一行的第二列中打印该值,然后退出。