在UNIX中特定字段中的值转换

时间:2014-09-17 17:06:59

标签: unix sed gsub

以下值存在于文件

A|0001|.00|xyz|.00 
B|0002|1.00|xyz|.00 
C|0003|12.43|xyz|.00 

我希望输出文件中的值为

A|0001|0.00|xyz|0.00 
B|0002|1.00|xyz|0.00 
C|0003|12.43|xyz|0.00 

如何实现这一目标?

3 个答案:

答案 0 :(得分:2)

假设您要将这些列中的数字标准化为始终具有整数和两位有效数字,则应该按照您的要求执行此操作:

awk -v FS=\| -v OFS=\| '{$3=sprintf("%.2f", $3); $5=sprintf("%.2f", $5)}7' file

$ cat file
A|0001|.00|xyz|.00
B|0002|1.00|xyz|.00
C|0003|12.43|xyz|.00
D|0004|.54|xyz|1

$ awk -v FS=\| -v OFS=\| '{$3=sprintf("%.2f", $3); $5=sprintf("%.2f", $5)}7' file
A|0001|0.00|xyz|0.00
B|0002|1.00|xyz|0.00
C|0003|12.43|xyz|0.00
D|0004|0.54|xyz|1.00

答案 1 :(得分:1)

通过perl,

$ perl -pe 's/\B(?=\.)/0/g' file
A|0001|0.00|xyz|0.00 
B|0002|1.00|xyz|0.00 
C|0003|12.43|xyz|0.00 

通过sed,

$ sed -r 's/\|\./|0./g' file
A|0001|0.00|xyz|0.00 
B|0002|1.00|xyz|0.00 
C|0003|12.43|xyz|0.00 

答案 2 :(得分:0)

这是另一个awk

awk -F\| '$3~/^\./ {$3="0"$3} $5~/^\./ {$5="0"$5}1' OFS=\| file
A|0001|0.00|xyz|0.00
B|0002|1.00|xyz|0.00
C|0003|12.43|xyz|0.00