2015-06-26 42 views
2

我處理它具有以下格式的文件:文字處理文件

"1999-01-04";1391.12;3034.53;66.515625;86.2;441.39 
"1999-01-05";1404.86;3072.41;66.3125;86.17;440.63 
"1999-01-06";1435.12;3156.59;66.4375;86.32;441 

有時候,有沒有小數值(例如441,而不是441.0),我需要的小數在那裏。我如何編寫一個腳本,以便所有整數都被添加爲.0以便它們變成浮動狀態?

+0

我知道,這不是問題的答案,因爲您要求提供基於bash的解決方案。無論如何,爲什麼你不使用python的'csv'模塊呢? –

+1

如果你知道輸入字段的數量爲6個,你可以只瞄準低,與'awk的-F \去; '{printf的 「%S;%S;%S;%S;%S;%2F \ n」 個,$ 1,$ 2,$ 3,$ 4 $ 5,$ 6}''。 –

+0

兩個原因基本上是:1)我不太瞭解Python,第2)我知道這個小(如果它是正確的)告訴我是bash比Python快了很多。因此,我更感興趣學習如何在bash中做到這一點,以便我可以用這些知識以較小的成本處理大文件。說得通? –

回答

5

使用sed

sed 's/\(;[^\.]*\)\(;\|$\)/\1.00\2/g' file 

只是一個簡單的替換正則表達式。

"1999-01-04";1391.12;3034.53;66.515625;86.2;441.39 
"1999-01-05";1404.86;3072.41;66.3125;86.17;440.63 
"1999-01-06";1435.12;3156.59;66.4375;86.32;441.00 
+0

深思熟慮:d –

+0

'^ 1'但恕我直言,如果你加上'-r'更清晰,破除一切逃逸的激活ERE metachars:'sed的-r 'S /([^ \。] *)(; | $)/ \ 1.00 \ 2/G' file' –

2

保存此awk腳本awk.src

BEGIN { 
    FS=";" 
} 
# 
## MAIN Block 
# 
{ 
    printf $1; printf FS; 
    for (i=2;i<=NF;i++) { 
    if ($i !~ "\\.") { 
     printf "%.1f", $i; 
    } 
    else { printf $i; } 
    if (i!=NF) { 
     printf FS; 
    } 
    else { printf "\n"; } 
    } 
} 

試試:

$ awk -f awk.src < sample.txt 
"1999-01-04";1391.12;3034.53;66.515625;86.2;441.39 
"1999-01-05";1404.86;3072.41;66.3125;86.17;440.63 
"1999-01-06";1435.12;3156.59;66.4375;86.32;441.0