我處理它具有以下格式的文件:文字處理文件
"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以便它們變成浮動狀態?
我處理它具有以下格式的文件:文字處理文件
"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以便它們變成浮動狀態?
使用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
深思熟慮:d –
'^ 1'但恕我直言,如果你加上'-r'更清晰,破除一切逃逸的激活ERE metachars:'sed的-r 'S /([^ \。] *)(; | $)/ \ 1.00 \ 2/G' file' –
保存此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
我知道,這不是問題的答案,因爲您要求提供基於bash的解決方案。無論如何,爲什麼你不使用python的'csv'模塊呢? –
如果你知道輸入字段的數量爲6個,你可以只瞄準低,與'awk的-F \去; '{printf的 「%S;%S;%S;%S;%S;%2F \ n」 個,$ 1,$ 2,$ 3,$ 4 $ 5,$ 6}''。 –
兩個原因基本上是:1)我不太瞭解Python,第2)我知道這個小(如果它是正確的)告訴我是bash比Python快了很多。因此,我更感興趣學習如何在bash中做到這一點,以便我可以用這些知識以較小的成本處理大文件。說得通? –