2016-10-11 43 views
0

我想總結一個CSV中的列並用總和除以常量,但有些東西似乎並不正確。用AWK劃分列的總和不能正常工作

awk 'BEGIN{FS=OFS=","} 
NR==1{print} 
NR>1{for (i=1;i<=NF;i++) a[i]+=$i} 
END{for (i=1;i<=NF;i++) if (a[i] != 0) printf $wierdConst/a[i] OFS; printf "\n"}' 

當我沒有做劃分,

​​

我得到總爲6440349377和我不斷$wierdConst是39600000000.但當部門做好了所有我得到的是0.0160752這我不不知道它從哪裏來。任何幫助深表感謝。

+1

在黑暗中拍攝 - 是'wierdConst'一個shell變量? Awk不是外殼 - 請參閱http://cfajohnson.com/shell/cus-faq-2.html#Q24 –

+2

您將常數除以總和,而不是將常數除以總和。 – Barmar

+0

EdMorton非常感謝..我根本不知道這一點。 Barmar的解決方案工作.. @Barmar標題是誤導。我想用列的總和除以你的解決方案的總和不變 –

回答

1

shell變量不會在awk腳本內擴展。 $weirdconstweirdconst作爲awk變量,而$表示訪問該字段號。由於您從未設置過weirdconst,因此這將變爲0,因此您正在打印$0/a[i]

使用-v選項從shell變量中設置awk變量。

awk -v weirdconst=$weirdconst 'BEGIN{FS=OFS=","} 
NR==1{print} 
NR>1{for (i=1;i<=NF;i++) a[i]+=$i} 
END{for (i=1;i<=NF;i++) if (a[i] != 0) printf weirdConst/a[i] OFS; printf "\n"}' 
+0

非常感謝!它工作,我根本不知道這一點。 –

+0

@Isu如果解決了問題,您應該通過單擊複選標記來接受答案。 – Barmar