【问题标题】:awk: if a user defined function returns 1, start from the very beginningawk:如果用户定义的函数返回 1,则从头开始
【发布时间】:2020-07-02 13:56:22
【问题描述】:

假设我有以下脚本:

function helper1() {
    if (NR==3 && !/PATTERN/) {
        return 1
    } else {
        if (NR>=13) {
            print $0
        }
        return 0
    }
}

BEGIN {
    if (helper1() == 1) {
            print $0
    }
}

这意味着,我有一个用户定义的辅助函数,它检查文件的第 3 行是否包含一些 PATTERN,如果是这样,那么它会打印出从第 13 行开始的所有其他行。

但如果它不是真的(辅助函数返回 1),那么我希望 awk 打印从第 1 行开始的所有行。这不会发生 :)

在此不胜感激,

谢谢。

【问题讨论】:

    标签: awk


    【解决方案1】:

    你可以使用这个awk:

    awk 'NR < 3 {                # for first 2 lines
       s = s $0 ORS              # store all lines in a variable s
       next                      # skip to next record
    }
    NR == 3 {                    # for record number 3
       if (/PATTERN/)            # if PATTERN is found  
          p = 1                  # set flag p to 1
       else                      # else
          printf "%s", s         # print first 2 lines
    }
    (p && NR >= 13) || !p        # print if flag is not set or else if NR >= 13
    ' file
    

    使用函数:

    awk '
    function helper1() {
       if (NR < 3) {
          s = s $0 ORS
          return 0
       }
       else if (NR == 3) {
          if (/PATTERN/)
             p = 1
          else
             printf "%s", s
       }
    return (p && NR >= 13) || !p
    }
    
    helper1()
    ' file
    

    【讨论】:

    • 谢谢!然而,我的观点也是让这个小脚本可以通过这些小辅助函数进行扩展(比如,可以有多种不同结构的文件,我希望脚本对所有文件进行不同的操作:首先,我们尝试helper1(),它失败了,好的,接下来我们尝试helper2(),它失败了,...,最后,如果所有其他测试都失败了,我们就按原样打印文件)。是否有可能使用该辅助函数方法来做到这一点?还是一个有缺陷的策略?
    • 也可以在函数中完成。让我在几分钟内进行修改。
    猜你喜欢
    • 2012-09-03
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2019-12-07
    • 2019-09-11
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多