我有一个包含文字和数字的文件,就像这样
had hdb hdc
1.5 -.3 4.6
2.0 7.1 .09
.17 7.4 8.9
那么对于那些在小数点前没有前导零的数字,如何用简单的一行命令添加这些零呢?
答案 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