2015-10-12 136 views
1

我需要25慶典輪4

line= wc -l < file.txt 
    # 47322487 lines 

    parts= $line/25 
    # 1892899.48 after division 

    round 1892899.48 this to nearest multiple of 4. 
+0

W帽子的價值是你想得到的輸出? –

回答

1

處理它的一個非常簡單的方法是先除以100再乘以4,然後再加上50來圍繞數字。

expr '(' $line + 50 ')'/100 '*' 4 
+2

正確處理舍入(我忘了!)。如果你打算使用shell算法,我認爲最好使用'echo $(((line + 50)/ 100 * 4))'而不是'expr'。 –

+0

好的解決方法,謝謝 – SSh

3

獲得的4個最近多個分割線的次數後最接近的整數倍我建議你用awk解決這個問題的全部:

awk 'END { print int((NR/100) + 0.5) * 4 }' file.txt 

這通過25 * 4然後使用int四捨五入的結果,被添加,使得值被舍入到附近4.

0.5乘以背面之前除以行數價值。要總是舍入,可以將其刪除並總是舍入,可以添加1。

+0

該方法對大多數負數給出了錯誤的結果。當數字是4的倍數,例如'awk'{print int(($ 0/4)+1)* 4}'<<< 4'打印時,添加1而不是0.5總是舍入8.當不添加0.5時,負數會向上舍入,而不是向下,例如'awk'{print int(($ 0/4)+1)* 4}'<<< - 3'打印0. – user4669748

+0

@鑑於最初的問題是圍繞文件中行數的四捨五入,該解決方案沒有考慮負數。 –

1

回合4最接近的倍數,舍入二者6和10至8

awk '{print sprintf("%.0f",$0/4)*4}' 

回合4最接近的倍數,總是舍入數,其模數爲4是2或-2了。

jq -R 'tonumber/4+.5|floor*4' 

回合4最接近的倍數,舍入總是其模4爲2或-2向上號碼,假設所有數字都是非負的。這給大多數負數提供了錯誤的結果。

awk '{print int(($0/4)+0.5)*4}' 

回合高達4.

awk '{print$0+(n-$0%n)%n}' n=4 
perl -MPOSIX -lpe'$_=ceil($_/4)*4' 

回合的倍數降到4.

awk '{print$0+(n-$0%n)%n}' n=-4 
perl -MPOSIX -lpe'$_=floor($_/4)*4' 
jq -R 'tonumber/4|floor*4' 
awk '{i=int($0/4);print((i==$0||$0>0)?i:i-1)*4}' 

回合正數的倍數下降到4個圓負數的倍數達到4的倍數。

awk '{print int($0/4)*4}'