更新 unix 平面文件中的值
Update value within a unix flat file
请帮忙。我想让 .0 在 UNIX 文件 yyyyy.csv :
中成为 0.0
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
您需要转义正则表达式中存在的所有点,否则它会匹配任何字符。也就是说,.
是正则表达式中的一个特殊元字符,可以匹配任何字符。要匹配文字点,您需要转义 .
.
sed 's/;\.0/;0.0/g' yyyyy.csv
这就足够了。
$ sed 's/;\.\([0-9]\)/;0./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 中的数字。我们可以通过反向引用来引用捕获的字符,即 </code>。替换部分的 <code>
是指组索引 1 中存在的字符。
将您的命令更改为:
sed 's/;\./;0./g' File
即,只需将 ;.
替换为 ;0.
。
只需使用理解数字的工具打印您的文件:
$ awk -F';' '{printf "%d;%f;%s\n", ,,}' 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", ,,}' 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", ,,}' 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
无论你喜欢什么精度...
请帮忙。我想让 .0 在 UNIX 文件 yyyyy.csv :
中成为 0.0603905209;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
您需要转义正则表达式中存在的所有点,否则它会匹配任何字符。也就是说,.
是正则表达式中的一个特殊元字符,可以匹配任何字符。要匹配文字点,您需要转义 .
.
sed 's/;\.0/;0.0/g' yyyyy.csv
这就足够了。
$ sed 's/;\.\([0-9]\)/;0./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 中的数字。我们可以通过反向引用来引用捕获的字符,即 </code>。替换部分的 <code>
是指组索引 1 中存在的字符。
将您的命令更改为:
sed 's/;\./;0./g' File
即,只需将 ;.
替换为 ;0.
。
只需使用理解数字的工具打印您的文件:
$ awk -F';' '{printf "%d;%f;%s\n", ,,}' 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", ,,}' 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", ,,}' 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
无论你喜欢什么精度...