进一步定义GAWK匹配和除法操作

时间:2019-02-15 03:51:58

标签: regex awk

我有一些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,应该四舍五入(这不是很重要,但是会很好))

1 个答案:

答案 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)。