我有一些TXT文件,其中的数字需要除以4。 我匹配和更改的文本行是:-
scale = 23 23
我的GAWK小文件看起来像这样:-
/scale [\=] [0-9]+ [0-9]+/ {
$3 = int($3/4)
$4 = int($4/4) }
{print}
所以我成功获得“比例= 5 5”
但是,我还有3个要求,并且希望获得帮助...
1)“ scale”参数只能是在其上方某些行上的另一个名为“ detail”的匹配之后。 (因此,与其简单地匹配每个“ scale =”,不如匹配它是“ detail(.....)scale =“)(它们之间的任何数字/字母/ +换行符)
2)这些“标度”值绝不能低于1。 (将所有小于6的结果相除总是1(只需将“ scale = 0”更改为“ scale = 1”即可)
3)值最好应四舍五入而不是向下舍入。 (因此,这里不是23的5,而是实际的5.75,应该四舍五入(这不是很重要,但是会很好))
答案 0 :(得分:1)
也许是这样?
awk '/detail/ { d=1 }
d && /scale = [0-9]+ [0-9]+/ && $3>1 && $4>1 {
$3 = $3<6 ? 1 : sprintf("%1.0f", $3/4)
$4 = $4<5 ? 1 : sprintf("%1.0f", $4/4)
d = 0 }
1'
sprintf
(带有合适的格式说明符)将进行四舍五入(例如参见https://www.gnu.org/software/gawk/manual/html_node/Round-Function.html)
如果x ? y : z
为真,则三元运算符y
产生x
,否则为z
。
还要注意一些小的简化(=
不需要反斜杠或字符类,{print}
可以简化为1
)。