【问题标题】:Remove trailing zeros in a file except character删除文件中除字符外的尾随零
【发布时间】:2014-06-09 08:37:31
【问题描述】:

我的文件中有以下值:

1.5000
0.006
9.0001
104.2500
17.0000
3.5000
paper

我想删除尾随零,以下awk 将删除尾随零,但为字符值打印零:

awk '{a=$0+0;if (a!~/\./) a=a".0";print a}' file

以上awk的输出:

1.5
0.006
9.0001
104.25
17
3.5
0.0

如何修改awk跳过字符?

异常输出:

1.5
0.006
9.0001
104.25
17.0
3.5
paper

【问题讨论】:

标签: shell awk


【解决方案1】:

使用sed

sed 's/,\([0-9]*[.]0\?\)\(\(0*[1-9]\+\)*\)0*/,\1\2/' input

这给出了:

1.5
0.006
9.0001
104.25
17.0
3.5
paper

对于多列文件:

awk '$2~/^[0-9]+[.][0-9][1-9]*0+$/{
     $2=gensub(/([.]0?([0-9]*[1-9]+)?)0*$/, "\\1", "g", $2)}1' input

【讨论】:

  • 谢谢,如果输入值为第二列,如何在制表符分隔文件中使用上述 sed。
  • 我在awk -F, '$2~/^[0-9]+[.][0-9][1-9]*0+$/{$2=gensub(/([.]0?([0-9]*[1-9]+)?)0*$/, "\\1", "g", $2)}1' sa.txt 下面使用过它会打印两列
  • 你想要单列吗?
  • 我有像 1.5000,1.5000 这样的逗号分隔文件,我需要 awk 来单独检查第二列的值。并像 1.5000,1.5 一样打印结果。谢谢
【解决方案2】:
 awk ' {print $2}' yourinputfile | awk ' { sub("\\.*0+$","");print} '

希望对你有帮助。

【讨论】:

    【解决方案3】:

    这是怎么做的:

    awk '/^ *[0-9]+\.[0-9]+/{sub(/0+$/,"");sub(/\.$/,".0")}1' file
    1.5
    0.006
    9.0001
    104.25
    17.0
    3.5
    paper
    

    PS 不需要开始两个相等的帖子:
    remove trailing zero using awk

    ^ *0 或多个空格开头(某些行中有空格)
    [0-9]+ 一个或多个数字 eks:5 545 34654635
    \. a理想点(. 需要转义)

    0+$ 将行尾$ 处的一个或多个0 替换为空
    \.$ 如果然后行以. 结尾,则添加0 以获取17.0 而不是@987654338 @

    【讨论】:

    • 谢谢@jotne,你能解释一下这个awk吗?我对 +\ 有点困惑
    • @Marjer 更新了我的帖子以帮助理解它的工作原理。
    猜你喜欢
    • 2011-05-30
    • 2014-08-09
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多