使用awk删除尾随零

时间:2014-06-08 17:55:34

标签: linux shell unix awk

我的文件中包含以下值:

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

4 个答案:

答案 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输出所有行的默认行为 - 无论是否已修改 - 只是没有匹配数字的行(不需要修改的数字)只是通过。