2016-01-26 40 views
1

我對使用awk有點新。我的目標是創建窗體的bash函數:awk乘法給出零

myfunction file column value 

這需要在文件中給定的列號,值相乘,並重寫文件。現在我已經寫了以下內容:

function multiply_column { 
file=$1 
column=$2 
value=$3 
awk -F" " '{print $col*mul}' col=$column mul=$value $file 
} 

我的文件是這樣的:

0.400000E+15 0.168933E+00 -0.180294E-44 0.168933E+00 
    0.401000E+15 0.167689E+00 -0.181383E-44 0.167689E+00 
    0.402000E+15 0.166502E+00 -0.182475E-44 0.166502E+00 
    0.403000E+15 0.165371E+00 -0.183569E-44 0.165371E+00 
    0.404000E+15 0.164298E+00 -0.184666E-44 0.164298E+00 
    0.405000E+15 0.163284E+00 -0.185766E-44 0.163284E+00 
    0.406000E+15 0.162328E+00 -0.186868E-44 0.162328E+00 
    0.407000E+15 0.161431E+00 -0.187972E-44 0.161431E+00 
    0.408000E+15 0.160593E+00 -0.189080E-44 0.160593E+00 
    0.409000E+15 0.159816E+00 -0.190189E-44 0.159816E+00 
    0.410000E+15 0.159099E+00 -0.191302E-44 0.159099E+00 
    0.411000E+15 0.158442E+00 -0.192416E-44 0.158442E+00 
    0.412000E+15 0.157847E+00 -0.193534E-44 0.157847E+00 
    0.413000E+15 0.157312E+00 -0.194653E-44 0.157312E+00 
    0.414000E+15 0.156840E+00 -0.195775E-44 0.156840E+00 
    0.415000E+15 0.156429E+00 -0.196899E-44 0.156429E+00 
    0.416000E+15 0.156081E+00 -0.198026E-44 0.156081E+00 
    0.417000E+15 0.155796E+00 -0.199154E-44 0.155796E+00 
    0.418000E+15 0.155573E+00 -0.200285E-44 0.155573E+00 
    0.419000E+15 0.155413E+00 -0.201418E-44 0.155413E+00 
    0.420000E+15 0.155318E+00 -0.202554E-44 0.155318E+00 
    0.421000E+15 0.155285E+00 -0.203691E-44 0.155285E+00 
    0.422000E+15 0.155318E+00 -0.204831E-44 0.155318E+00 
    0.423000E+15 0.155414E+00 -0.205973E-44 0.155414E+00 
    0.424000E+15 0.155575E+00 -0.207116E-44 0.155575E+00 
    0.425000E+15 0.155802E+00 -0.208262E-44 0.155802E+00 

我設法只是打印的第一列,但是當我跟我的價值乘以它,awk給予我0 。我嘗試了其他格式不同的文件,我的功能完美。我也試圖把它與BC結合起來,沒有任何成功。

有沒有人看到爲什麼在這種情況下awk給0?

在此先感謝!

#########編輯

我剛剛發現,如果我的數據文件使用逗號,而不是點(即0,400000E的+ 15代替0.400000E + 15),我的功能工作正常。所以不知何故,在某個地方,某些東西被配置爲將逗號理解爲科學記號分隔符而不是點。這對任何人都是鍾情嗎?

+1

嗯,適合我... –

+0

我忘了提及我使用Mac OSX。這可能是相關的嗎? – Scrimbibete

+0

你如何精確地調用'multiply_column'函數?哪些參數? – hek2mgl

回答

4

設置LC_ALL=C

另外,如果你想爲點,以不使用GNU AWK被接受作爲小數點分隔符,但當前區域是使用逗號和,你可以運行這個以獲得最常見的行爲和其他與語言環境相關的問題。見http://www.gnu.org/software/gawk/manual/gawk.html#Locales。也不要毫無意義地將FS設置爲默認值,請引用您的shell變量(如果您不知道爲什麼,請使用google),並確定您設置變量的方式,以使用產生最直觀結果的表單見http://cfajohnson.com/shell/cus-faq-2.html#Q24):

LC_ALL=C awk -v col="$column" -v mul="$value" '{print $col*mul}' "$file" 

讀過書的有效AWK編程,第4版,由阿諾德·羅賓斯。

+0

'''LC_ *'變量中的哪個變量'awk'用於那個?我有一個[「混合」語言環境](http://pastebin.com/H8VHXVbx),其中'LC_NUMERIC = de_DE.UTF-8'和問題的腳本起作用。 – hek2mgl

+0

@ hek2mgl您使用的是GNU awk嗎? – jlliagre

+0

@ hek2mgl如果我理解你的問題 - awk沒有使用它們中的任何一個,因爲默認情況下'.'是小數點,除非LC_NUMERIC被填充並且在命令上設置了--use-lc-numeric線。默認情況下,gawk的行爲就像一個語言環境中人們常見的情況一樣,其中','被定義爲他們的語言環境的小數點,但他們的輸入數據使用'.'s(這顯然是OP的情況,但他不是使用gawk或它會按照期望行事)。 –

2

用於創建數據文件的語言環境與當前語言環境之間不匹配。

例如,法語區域設置和類似的使用逗號作爲它們的小數點分隔符,而點是最廣泛使用的,並且也是POSIX默認設置。

如果你想爲逗號被接納爲小數點分隔符,則可能解決辦法是這樣的問題:

LC_NUMERIC=fr_FR.UTF-8 awk '{print $col*mul}' col="$column" mul="$value" "$file" 

注意,這將無法正常工作與GNU awk不兌現的數字區域設置默認情況下。您需要使用--use-lc-numeric標誌來覆蓋。執行你的腳本之前

LC_NUMERIC=C awk '{print $col*mul}' col="$column" mul="$value" "$file" 
+1

順便說一下,您可以使用「locale」命令來檢查您的語言環境。 –

+0

我的語言環境是'LC_NUMERIC = de_DE.UTF-8',它也使用','作爲小數點分隔符。這個對我有用。 – hek2mgl

+0

@ hek2mgl什麼適合你?發佈的數據文件?實際的數據文件?用GNU awk? Unix awk? – jlliagre