2015-02-06 3 views
0

Просьба помочь. Я хочу сделать .0 быть 0.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 

В базовом СЭДЕ, \(...\) называется capturing group, который используется для захвата символов, соответствующих шаблон, находящегося внутри этой группы. Таким образом, шаблон, присутствующий внутри группы, равен [0-9], который соответствует цифре от 0 до 9. Мы могли бы передать захваченные символы через обратную ссылку, то есть \1. \1 в сменной части относится к символам, которые присутствуют внутри индекса группы 1.

+0

@Raj Спасибо. Он отлично работал. – Drsin

+0

@AMD Спасибо. Он отлично работал. – Drsin

+0

@ Raj. '$ sed 's /; \. \ ([0-9] \) /; 0. \ 1/g' file' Это тоже хорошо работает. Можете ли вы объяснить мне, почему \ после '[0-9]' и '\ 1'. Благодарю. – Drsin

0

Изменить команду:

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

т.е., просто заменить ;.;0. с.

+0

ok .. отредактировал .. спасибо –

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 

Независимо от точности вы хотите ...

Смежные вопросы