2015-02-06 109 views
0

請幫助。我要讓0.00.0 UNIX文件yyyyy.csv內:更新unix平面文件中的值

603905209;47.824;USD 
603905477;57.199;USD 
603938657;3.2281;USD 
603949388;.00191;USD 
603937274;.00563;USD 
603911160;.00287;USD 

我想要的結果是

603905209;47.824;USD 
603905477;57.199;USD 
603938657;3.2281;USD 
603949388;0.00191;USD 
603937274;0.00563;USD 
603911160;0.00287;USD 

但我得到了這樣的結果:

603905209;0.4.7824;USD 
603905477;0.5.7199;USD 
603938657;0.3.2281;USD 
603949388;0.00191;USD 
603937274;0.00563;USD 
603911160;0.00287;USD 

以下是我的命令:

sed 's/;.0/;0.0/g' yyyyy.csv | sed 's/;.2/;0.2/g' | sed 's/;.1/;0.1/g' | sed 's/;.3/;0.3/g' | sed 's/;.4/;0.4/g' | sed 's/;.5/;0.5/g'| sed 's/;.6/;0.6/g' | sed 's/;.7/;0.7/g' | sed 's/;.8/;0.8/g' | sed 's/;.9/;0.9/g' > xxxxx.csv 

回答

1

您需要轉義所有呈現在您的正則表達式中的點,否則它將匹配任何字符。也就是說,.是正則表達式中與任何字符匹配的特殊元字符。要匹配字面點,您需要轉義.

sed 's/;\.0/;0.0/g' yyyyy.csv 

而這就足夠了。

$ sed 's/;\.\([0-9]\)/;0.\1/g' file 
603905477;57.199;USD 
603938657;3.2281;USD 
603949388;0.00191;USD 
603937274;0.00563;USD 
603911160;0.00287;USD 

在基本的sed,\(...\)稱爲capturing group,它用於捕獲由本該組內的圖案匹配的字符。所以組內出現的模式是[0-9],它匹配0-9的數字。我們可以通過反向引用來引用捕獲的字符,即\1\1在更換部件是指存在於組索引1

+0

@Raj感謝。它工作完美。 – Drsin 2015-02-06 08:02:12

+0

@AMD謝謝。它工作完美。 – Drsin 2015-02-06 08:02:45

+0

@Raj。 '$ sed's /; \。\([0-9] \)/; 0. \ 1/g'file'這個效果很好。你能解釋一下爲什麼在'[0-9]'和'\ 1'後有\。謝謝。 – Drsin 2015-02-06 08:08:27

0
內部

您的命令,切換到字符:

sed 's/;\./;0./g' File 

即,只是代替;.;0.用。

+0

ok ..編輯..謝謝 – 2015-02-06 08:03:47

0

使用的工具,瞭解數字只是打印文件:

$ awk -F';' '{printf "%d;%f;%s\n", $1,$2,$3}' file 
603905209;47.824000;USD 
603905477;57.199000;USD 
603938657;3.228100;USD 
603949388;0.001910;USD 
603937274;0.005630;USD 
603911160;0.002870;USD 

awk -F';' '{printf "%d;%.5f;%s\n", $1,$2,$3}' file 
603905209;47.82400;USD 
603905477;57.19900;USD 
603938657;3.22810;USD 
603949388;0.00191;USD 
603937274;0.00563;USD 
603911160;0.00287;USD 

$ awk -F';' '{printf "%d;%.2f;%s\n", $1,$2,$3}' file 
603905209;47.82;USD 
603905477;57.20;USD 
603938657;3.23;USD 
603949388;0.00;USD 
603937274;0.01;USD 
603911160;0.00;USD 

任何你喜歡的精密...