我正在撰寫一個 bash 腳本,它具有 1)檔案中與模式匹配的行數和 2)檔案中的總行數。
a)要獲取目錄中具有特定模式的檔案中的行數,我使用了 grep -c "p??attern" f*
b)對于我使用的目錄中每個檔案的總行數 wc -lf*
我正在嘗試將輸出從 2 除以 1。我嘗試了一個 for 回圈
for i in $a
do
printf "%f\n" $(($b/$a)
echo i
done
但這會回傳錯誤syntax error in expression (error token is "first file in directory")
我也試過
bc "$b/$a"
這也不起作用
我不確定這是否可行——任何建議表示贊賞。謝謝!
示例: grep -c *f 生成這樣的串列
myfile1 500
myfile2 0
myfile3 14
myfile4 18
wc -l *f 生成一個這樣的串列:
myfile1 500
myfile2 500
myfile3 500
myfile4 238
我希望我的輸出是 grep/wc 的輸出結果,例如
myfile1 1
myfile2 0
myfile3 0.28
myfile4 0.07
uj5u.com熱心網友回復:
bash僅支持整數數學,因此以下將列印(靜默)截斷的整數值:
$ a=3 b=5
$ printf "%f\n" $(($b/$a))
1.000000
bc是一種解決方案,并調整了 OP 的當前代碼:
$ bc <<< "scale=2;$b/$a"
1.66
# or
$ echo "scale=4;$b/$a" | bc
1.6666
如果您碰巧從實數/浮點數開始,則該printf方法將出錯(更具體地說,$(($b/$a))將產生錯誤):
$ a=3.55 b=8.456
$ printf "%f\n" $(($b/$a))
-bash: 8.456/3.55: syntax error: invalid arithmetic operator (error token is ".456/3.55")
bc救援:
$ bc <<< "scale=2;$b/$a"
2.38
# or
$ echo "scale=4;$b/$a" | bc
2.3819
注意:在 OP 的父代碼中應該有一個測驗$a=0,如果為真,則決定如何繼續(例如,將答案設定為0;跳過計算;列印警告訊息)否則此代碼將生成divide by zero錯誤
uj5u.com熱心網友回復:
bash沒有內置的浮點運算,但可以在一定程度上進行模擬。例如,為了將分數的值截斷a/b到小數點后兩位(不四舍五入):
q=$((100*a/b)) # hoping multiplication won't overflow
echo ${q:0:-2}.${q: -2}
小數位數可以引數化:
n=4
q=$((10**n*a/b))
echo ${q:0:-n}.${q: -n}
uj5u.com熱心網友回復:
這awk將完成所有作業:
awk '/pattern/{a =1}END{print a/NR}' f*
uj5u.com熱心網友回復:
jot 93765431 | mawk -v __='[13579]6$' 'BEGIN { _^=__=_*=FS=__ }{ __ =_<NF } END { if (___=NR) { printf(" %\47*.f / %\47-*.f ( %.*f %% )\n", _ = _*_*_ ,__,_,___,_--,_*__/___*_) } }'
4,688,271 / 93,765,431 ( 4.99999941343 % )
filtering pattern=[13579]6$
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/520107.html
標籤:重击浮点分配
下一篇:將范圍轉換為字串
