AWK:if和条件语句在同一块中

熊猫142308

这是脚本的代码,在其中我必须检查文件名为“ pretempsc.cfg”并按原样打印其内容。仅对于其他文件,我应该将以“ abc disable ...”开头的行修改为“ no abc ...”。

    #!/bin/sh
    IN_FILE=$1
    OUT_FILE=$2

    WhatFileIsIt() {
    awk -v filename=$IN_FILE '
    BEGIN {
        scnode = 0;
        if (filename == "pretempsc.cfg") {
            scnode = 1; }
    }
    {
        if (!scnode) {
            /^abc disable/ {
            print "no abc "$4"";
            next;
            }

            print;}
        }
        else {print}
    }
    '
    }

    cat $IN_FILE | WhatFileIsIt | cat > $OUT_FILE

执行此脚本时,出现以下错误:

 awk: cmd. line:9:         /^abc disable/ {
 awk: cmd. line:9:                        ^ syntax error
 awk: cmd. line:16:     else {print}
 awk: cmd. line:16:     ^ syntax error

从我的查找来看,我怀疑在操作块中使用if和condition-action是错误的,但是我无法确切地找出错误所在。

注意:我必须在shell脚本中使用awk,并且还有很多类似于WhatFileIsIt的其他函数,它们在IN_FILE上进行自己的处理。

伊尔卡楚

是的,您需要将该模式匹配更改为完整的if语句:

if (/^abc disable/) {
    print "no abc "$4"";
    next;
}

/pattern/是的简写$0 ~ /pattern/,其中$0包含整个输入行。)

请注意,printthere仅在输入之后打印输入的第四列no abc,因此abc disable foo bar doo变成just no abc bar我不确定这是否是您想要的。


在我们讨论它的同时,还会想到其他一些事情...如果它们太明显或与您的其余脚本冲突,则可以忽略其中的任何一个。(希望我们没有犯太多错误。)

我认为的末尾还有一个右大括号,print看来最深处条件的缩进有些偏离,因此需要重写一下:

{
    if (!scnode) {
        if (/^abc disable/) {
            print "no abc " $4;
            next;
        }
        print;
    } else {
        print;
    }
}

但是从这里开始,似乎唯一要做的事情是当!scnodetrue和/^abc disable/match成立,在所有其他情况下,只有print因此,我们可以将条件与&&(当然,不同类型文件之间的分隔不再明确):

{
    if (!scnode && /^abc disable/) {
        print "no abc "$4"";
        next;
    } else {
        print;
    }
}

由于存在next缩短执行时间的条件,因此最终代码print可以不包含该else子句,并且实际上,由于整个代码块只是an if,我们可以将条件降至主要级别,然后执行无条件的默认打印操作。

!scnode && /^abc disable/ {
    print "no abc "$4"";
    next;
}
1;

(当然,现在看起来可能有点过于简洁。)


另外,在shell脚本中,您无需打扰猫,最好让它们保持睡眠状态,而仅使用shell进行重定向。(并引用shell变量。)

 WhatFileIsIt < "$IN_FILE" > "$OUT_FILE"

该函数的名称有点令人困惑,它实际上并没有回答任何“什么”问题,而是处理文件。也许像ProcessFile

而且,在谈论函数时,该函数使用的变量IN_FILE不是它的局部变量如果曾经需要为两个不同的文件运行一个函数,可能会造成混淆。像shell脚本本身一样,该函数还可以接受参数,调用MyFunction foo,使之$1包含foo在函数内部。

所以我可能会做类似的事情

ProcessFile() {
awk < "$1" -v filename="$1" '
[...]

(将输入重定向放在awk命令行的中间还是结尾都没关系。)

用于:

ProcessFile "$IN_FILE" > "$OUT_FILE"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

markdown表达式和结果可以在同一块中插入吗?

通过在PIG中的同一块内计算出的条件值在FOREACH块内进行过滤

在分配变量的同一块中返回新变量

可以在同一块中存储多个文件吗?

if语句中的JavaScript代码的一部分运行,而同一块中的其余代码不执行。我在这里想念什么?

使用CSS和HTML在同一块中用一行分隔文本

如何从 terraform 中同一块中的前一行引用变量?

在同一块中使用Flux和Mono时出现StackOverflowError

在RMarkdown / Bookdown中给同一块中的两个图提供不同的标题

如何在不位于同一行的块中grep 2个字符串(AND条件),然后在同一块中查找其他内容

将两个捕获子句合并在同一块中

您可以在同一块中的互斥锁lock_guard之前添加代码吗

如何在同一块中显示两个部分?

如何在 Javascript 的帮助下在同一块中拖放图像?

如何使用内联在同一块中的元素显示 Bootstrap 网格视图?

如何更新一块中的字段

Nginx:当`index`和`try_files`在同一块中时,为什么要处理`try_files`,而不是`index`指令?

RMarkdown:在同一块使用环多ggplots

将“块前缀”添加到属于文件同一块的所有行

如何检测Haskell管道中的最后一块?

如何在一块内存中连接多个结构?

在golang中创建一块缓冲通道

在单独的jpanel中的drawImage仅绘制了一块

在一块中包含多个图的图形标题

一块一块地移动

或和条件在同一条IF语句中的行为不同

Halide:将一块内存复制到重叠位置(同一图像)

两块成一块

同一块的2个事务可以更新相同的状态键吗?