awk判斷整除常用的方法是用內建的int或者求餘數的算符%
被整數整除
輸出0-100之間能被9整除的整數
使用 num/9==int(num/9) 的判斷方法可以很好實現。
awk 'BEGIN{
for (i=0; i<100; i++) {
if (i/9==int(i/9)) print i
}}' | cat
或者使用 num%9==0 也可以輕鬆實現
awk 'BEGIN{
for (i=0; i<100; i++) {
if (i%9==0) print i
}}' | cat
被小數整除
常犯的錯誤
但是,如果輸出數列0.01, 0.02, 0.03, ... 1.00中能夠被0.09整除的數字時,
使用num/0.09==int(num/0.09)就行不通了,因為會遺漏很多數字。
使用命令awk 'BEGIN{for (i=0; i<1; i+=0.01) print i,i/0.09-int(i/0.09)}'
的輸出部分結果是:
0 0 0
0.01 0.01 0.111111
0.02 0.02 0.222222
...
0.16 0.07 0.777778
0.17 0.08 0.888889
0.18 2.77556e-17 4.44089e-16
0.19 0.01 0.111111
...
0.88 0.07 0.777778
0.89 0.08 0.888889
0.9 6.10623e-16 7.10543e-15
0.91 0.01 0.111111
0.92 0.02 0.222222
0.93 0.03 0.333333
0.94 0.04 0.444444
0.95 0.05 0.555556
0.96 0.06 0.666667
0.97 0.07 0.777778
0.98 0.08 0.888889
0.99 6.93889e-16 7.10543e-15
其中0.18,0.27都不是0,而是一個很小的數字,所以上面的方法只適用於整數的情況。
正確方法
輸出數列 3.0, 3.1, 3.2, 3.3, ... 5.0 中的可以被0.8整除的數字(正確答案是3.2, 4.0和4.8)
命令awk 'BEGIN{for (i=3; i<5; i+=0.1) print i,i%0.8,i/0.8-int(i/0.8)}'
輸出的結果是
3 0.6 0.75
3.1 0.7 0.875
3.2 0 0 !結果正確
3.3 0.1 0.125
3.4 0.2 0.25
3.5 0.3 0.375
3.6 0.4 0.5
3.7 0.5 0.625
3.8 0.6 0.75
3.9 0.7 0.875
4 6.66134e-16 8.88178e-16 !結果錯誤
4.1 0.1 0.125
4.2 0.2 0.25
4.3 0.3 0.375
4.4 0.4 0.5
4.5 0.5 0.625
4.6 0.6 0.75
4.7 0.7 0.875
4.8 0.8 1 !結果錯誤
4.9 0.1 0.125
5 0.2 0.25
所以正確的方法是使用以下命令:
awk 'BEGIN{
for (i=3; i<5; i+=0.1) {
if (i/0.8-int(i/0.8)<0.001 || i/0.8-int(i/0.8)>0.999) print i
}}' | cat
或者使用以下命令:
awk 'BEGIN{
for (i=3; i<5; i+=0.1) {
if (i%0.8<0.001 || i%0.8>0.799) print i
}}' | cat
包含負數時
如果包含負數,那麼上面的方法也有問題。
最終穩妥的判斷方法應該是:
num/0.5-int(num/0.5)<-0.999 || ( num/0.5-int(num/0.5)>-0.001 && num/0.5-int(num/0.5)<0.001 ) || num/0.5-int(num/0.5)>0.999
簡短的寫作:
zc=num/0.5-int(num/0.5)
if (zc<-0.999 || (zc>-0.001 && zc<0.001) || zc>0.999)
例如輸出-5到5之間能被0.5整除的小數
awk 'BEGIN{
for (i=-5; i<5; i+=0.1) {
zc=i/0.5-int(i/0.5);
if (zc<-0.999 || (zc>-0.001 && zc<0.001) || zc>0.999) printf("%4.1f\n",i)
}}' | cat