我的文件中包含以下值:
1.5000
0.006
9.0001
104.2500
17.0000
3.5000
我想删除尾随零,以下awk
将删除尾随零
awk '{ if ($0 ~ /\./){ sub("0*$","",$0); sub ("\\.$","",$0);} print}' file
输出上面的awk,
1.5
0.006
9.0001
104.25
17
3.5
但是我想在小数点后添加一个零,即。我想要的只是一个不带尾随零的浮点数,除了2.0,3.0
之类的值例外输出
1.5
0.006
9.0001
104.25
17.0
3.5
答案 0 :(得分:1)
可能sed
:
sed 's/0\+$//;s/\.$/.0/'
如果输入中出现1200
之类的整数,请单独处理:
sed '/\./{s/0\+$//;s/\.$/.0/;b};s/$/.0/'
答案 1 :(得分:0)
处理更好的长号和文字的新版本
cat file
1.5000
0.006
9.0001
104.2500
17.0000
3.5000
450.0005
test
my00000
awk '/^ *[0-9]+\.[0-9]+/{sub(/0+$/,"");sub(/\.$/,".0")}1' file
1.5
0.006
9.0001
104.25
17.0
3.5
450.0005
test
my00000
这样就无需替换所有前导0
。如果您在最终获得.
,请将其替换为.0
它还测试它的开头是0
还是更多,而不是数字。
答案 2 :(得分:0)
使用以下命令获得更准确的输出,
文件名:sam
cat sam
45.0005
0.4440000
45.000000
66.66
44.000
.45000
45
awk '{if($0 ~ /^[0-9]*\.[0-9]+/) { sub(/0+$/,"") sub(/\.$/,".0") sub(/^\./,"0.");} else if($0 ~ /^[0-9]+$/) {sub(/$/,".0");}}1' sam
输出:
45.0005
0.444
45.0
66.66
44.0
0.45
45.0
答案 3 :(得分:0)
在这种情况下,使用sed
可能更简单:
注意:
sed
和-E
(别名-r
)来启用对扩展正则表达式的支持,这使命令更具可读性。它应该与GNU sed
(Linux)和FreeBSD sed
(OSX)一起使用。s/.../.../
)。sed -E 's/^( *[0-9]+\.[0-9]([0-9]*[1-9])?)0+$/\1/' file
^
和结尾的$
确保整个输入行匹配 *
匹配前导空格(如果有)[0-9]+\.
匹配小数点前的所有数字,加上小数点[0-9]
匹配第一个小数位(单个数字) - 这可确保以.0
结尾的数字不会被删除其尾随0
([0-9]*[1-9])?
匹配任何其他数字,直到遇到非零数字(如果有)0+
然后通过行尾\1
指的是 1st 捕获组((...)
),除了尾随零之外的所有内容 - 有效地删除它们。sed
输出所有行的默认行为 - 无论是否已修改 - 只是没有匹配数字的行(不需要修改的数字)只是通过。