2015-11-05 55 views
0

我有兩個文件。每一列都有一列,其中有一些缺失的數據,如9999,9000。平均使用shell腳本或awk後兩個文件之間的區別

ifile1.txt ifile2.txt 
30   20 
9999   10 
10   40 
40   30 
10   31 
29   9000 
9000   9999 
9999   9999 
31   1250 
550   29 

我想計算上述兩個文件的平均值之間的差異,而不考慮缺失的值。即

average (ifile1.txt) - average (ifile2.txt) 

我試過這樣,但沒有得到結果。

ave1=$(awk '!/\9999/ && !/\9000/{sum += $1; count++} END {print count ? (sum/count) : count;sum=count=0}' ifile1.txt) 
ave2=$(awk '!/\9999/ && !/\9000/{sum += $1; count++} END {print count ? (sum/count) : count;sum=count=0}' ifile2.txt) 

result=$(ave1-ave2) 
echo $result 

回答

2
awk '!/9000|9999/{a[FILENAME]+=$0;b[FILENAME]++}END{for(i in a)c=c?c-a[i]/b[i]:a[i]/b[i];print c}' file1 file2 

更新:

awk '!/9000|9999/{a[ARGIND]+=$0;b[ARGIND]++}END{print a[1]/b[1]-a[2]/b[2]}' file1 file2 

awk '!/9000|9999/{a[ARGIND]+=$0;b[ARGIND]++}END{for(i=1;i<=ARGIND;i++)c=c?c-a[i]/b[i]:a[i]/b[i];print c}' file1 file2 
+0

我的結果表達式爲負值。但上面的腳本並沒有給出負面信號。你能建議怎麼做嗎?非常感謝你。 – Kay

+0

已更新。也許陣列順序問題 – bian

+0

非常感謝你的答案。如果我使用閾值,你能建議我怎麼修改腳本。我在這裏問過它http://stackoverflow.com/questions/33666553/difference-between-two-files-after-average-of-selected-entries-using-shell-scrip – Kay

1

awk將計算平均值,但bash將不會做浮點運算。不過,您始終可以使用bc

$ echo "$ave1 - $ave2" | bc 

-101.429

而且你必須使用$((...))

相關問題