如何在文件中的小数点前添加前导零

时间:2016-11-24 13:05:06

标签: bash awk sed

我有一个包含文字和数字的文件,就像这样

had   hdb   hdc
1.5   -.3   4.6
2.0   7.1   .09
.17   7.4   8.9

那么对于那些在小数点前没有前导零的数字,如何用简单的一行命令添加这些零呢?

6 个答案:

答案 0 :(得分:4)

一种选择是使用sed替代:

sed -E 's/(^|[^0-9])\./\10./g' file

匹配(并捕获)该行的开头或任何非数字后跟.。替换为已捕获的部分\1,然后是0.

had   hdb   hdc
1.5   -0.3   4.6
2.0   7.1   0.09
0.17   7.4   8.9

答案 1 :(得分:3)

搜索以非数字开头的小数,后跟全局数字(g标志),并将其替换为相同的模式(\ 2部分),但在小数前面加0。

sed 's/\([^0-9]\|^\)\(\.[0-9]*\)/\10\2/g' input.txt

输出:

had   hdb   hdc
1.5   -0.3   4.6
2.0   7.1   0.09
0.17   7.4   8.9

答案 2 :(得分:1)

perl支持外观

$ perl -pe 's/(?<!\d)\./0./g' file 
had   hdb   hdc
1.5   -0.3   4.6
2.0   7.1   0.09
0.17   7.4   8.9
  • (?<!\d)\.匹配.,前面没有数字
  • 0.对于此类匹配,请在
  • 之前添加0

答案 3 :(得分:0)

因为awk printf修饰符对我来说每次使用时都是个谜,我只能不得不试一试:

$ awk '
{
    for (i=1; i<=NF; i++)                          # for each field
        if($i ~ /[-\.0-9]+/)                       # if looks like a number
            printf "%5.2g%s", $i, (i<NF?OFS:ORS);  # print one way
        else 
            printf "%5s%s", $i, (i<NF?OFS:ORS)     # else the other way
}' file
  had   hdb   hdc
  1.5  -0.3   4.6
    2   7.1  0.09
 0.17   7.4   8.9

唯一可见的缺陷是2.0变为2(第3个记录,第1个字段)。有办法解决这个问题吗?

答案 4 :(得分:0)

Perl版本:

perl -pe 's/([\d\.-]+)/$1 < 1 ? $1 + 0 : $1/ge' file

输出:

had   hdb   hdc
1.5   -0.3   4.6
2.0   7.1   0.09
0.17   7.4   8.9

答案 5 :(得分:0)

为什么第一个子工作不能用于.09?

awk '{sub(/^\./,"0.")sub(/-/,"-0")sub(/\.09/,"0.09")}1' file

had   hdb   hdc
1.5   -0.3   4.6
2.0   7.1   0.09
0.17   7.4   8.9