我有一个包含大量文本的文件和一些描述数字的数字< 1具有三位精度。我想用大致相等的整数百分比(数字0-99)替换这些数字。
0.734 -> 73
0.063 -> 6
0.979 -> 97
圆正确地圆,但不是必需的。
我尝试了以下几种变体,我似乎无法获得一场比赛:
sed -e 's/0\.(\d\d)/&/' myfile.txt
我理解的意思是,匹配数字0,然后是小数,捕获数字旁边的并且sed用捕获的部分替换整个匹配?
即使我让它工作,我也不知道如何处理0.063 -> 6
案件。当然会对此有所帮助。
答案 0 :(得分:1)
sed
支持字符类但使用更长的POSIX名称。数字为[[:digit:]]
。只需写[0-9]
就可以了。
试试这个:
sed -E 's/0\.([0-9][0-9]).*/\1/;s/^0//' myfile.txt
-E
标志告诉它使用现代正则表达式。这里实际上有两个命令,由;
分隔:
s/0\.([0-9][0-9]).*/\1/
:将0
后面的两位数字和一个点放入捕获组,并将整个字符串替换为此捕获组。
s/^0//
:从上面的字符串中删除前导零。
答案 1 :(得分:0)
除了Zoff给出的tsv
回答之外,您可以使用awk更好地实现(使用舍入):
sed
仅限bash实现:
#round down
awk '{print int($1*100)}' myfile.txt
#0.979 -> 97
#round up
awk '{printf "%.0f\n",$1*100}' myfile.txt
#0.979 -> 98
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed -r 's/0\.(([1-9][0-9])|0([0-9])).*/\2\3/' file
这使用交替和反向引用(BR)来匹配所需的模式。 如果第一个模式匹配第二个BR将返回该值,第三个(BR)将为空。同样,如果交替中的第二个模式匹配,则第二个BR将为空,第三个BR将返回所需的值。