2014-06-08 86 views
0

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分鐘時間這樣做。我理解循環每個這些文件將需要更多時間,但爲什麼使用通配符失敗?

+0

我對某個文件做了測試,你的'awk'確實有效。對我來說,它給出了正確的價值。 「真正的最低限度」是什麼意思?你可以重寫一下:'awk'!min || $ 2 Jotne

+0

當您不迴應時,我們可以提供什麼幫助? – Jotne

+0

感謝您的回覆(我已經睡覺了)。 – user3719139

回答

0

您的awk腳本可能會爲每個min值做一個字符串而不是數字比較,特別是因爲腳本中的第一個語句明確是字符串比較。要強制數字,將其更改爲:

awk 'min=="" || $2 < min+0 {min=$2} END{print min}' */myfile.10* 

awk中把所有的輸入類型的數字串,這是你如何使用該輸入的第一次,讓AWK弄清楚,如果它實際上是一個數字或字符串。

+0

或只是'+ min'而不是'min + 0' –

+0

我發現'x <+ y'的語法不如'x

+0

awk'min ==「」|| $ 2 user3719139

0

我不知道爲什麼你得到你所提到的差異,但我會建議你使用sort來解決這個問題:

sort -n -k2 */myfile.10* 

執行數值排序,使用第二列作爲重點。 sort將輸出所有在所有文件中的行的,所以也許你可以用awk只打印你所感興趣的值:

sort -n -k2 */myfile.10* | awk 'NR==1 {print $2; exit}' 

將在第一線,然後出口的第二列打印值。

+0

這確實有效,但我懷疑它比使用awk做整件事效率低得多,因爲它需要對_whole_列表進行排序,而不是僅僅獲取最小值。我會把它留在這裏,因爲這是一個有效的解決方案,但我建議不要使用大量的數據。 –