【问题标题】:AWK with $0 replace pattern with new string using sed带有 $0 的 AWK 使用 sed 用新字符串替换模式
【发布时间】:2019-11-09 12:00:09
【问题描述】:

我有一个包含多个作业内容的文件,例如:

insert_job: 18132_TAL_D_DS_PEAR_AUTORECON   job_type: CMD 
command: $ADM_BIN/pear_generic_wrapper.ksh 
owner: gpadmin
permission: 

在这里,我需要为每个 insert_job 添加一行:

insert_job: 18132_TAL_D_DS_PEAR_AUTORECON   job_type: CMD 
condition: 18132_D_DS_PEAR_AUTORECON  

所以,基本上是 2 个步骤(首先复制行作业名称;然后在打印为条件的第二行复制行中将 18132_TAL_ 替换为 18132_:)

为此,我对每个 insert_job 行都进行到这一点:

insert_job: 18132_TAL_D_DS_PEAR_AUTORECON   job_type: CMD 
insert_job: 18132_TAL_D_DS_PEAR_AUTORECON 

现在,要更新第二行以将 insert_job 替换为条件,并将 18132_TAL_ 替换为 18132_,我被卡住了。

我正在尝试编写类似的代码:

$ cat input.dat | awk '($0!~"job_type") {print $0|sed "s/insert_job/condition/"} 1' 

但是,sed 在这里不起作用,它会给出语法错误。

您能否帮助在print $0 之后使用 sed 的正确语法。

【问题讨论】:

    标签: linux awk sed


    【解决方案1】:

    请您尝试关注一下。

    awk '
    /insert_job/{
      val=$2
      sub(/_[^_]*/,"",val)
      $0=$0 ORS "condition: " val
      val=""
    }
    1
    ' Input_file
    

    说明:为上述代码添加说明。

    awk '                            ##Starting awk code from here.
    /insert_job/{                    ##Checking condition if string insert_job is found in a line then do following.
      val=$2                         ##Creating variable val whose value is $2(2nd field) of current line.
      sub(/_[^_]*/,"",val)           ##Substituting _ till next occurrence of _ with NULL in val here.
      $0=$0 ORS "condition: " val    ##Concatenating ORS(new line) then string condition and variable val here.
      val=""                         ##Nullifying variable val here.
    }
    1                                ##1 will print edited/non-edited line here.
    '  Input_file                    ##Mentioning Input_file name here.
    

    输出如下:

    insert_job: 18132_TAL_D_DS_PEAR_AUTORECON   job_type: CMD 
    condition: 18132_D_DS_PEAR_AUTORECON
    command: /pear_generic_wrapper.ksh 
    owner: gpadmin
    permission: 
    

    【讨论】:

    • 效果很好。谢谢!
    【解决方案2】:

    这是你想要做的吗?

    $ awk '
        { print }
        sub(/^insert_job/,"condition") {
            sub(/_TAL/,"")
            print $1, $2
        }
    ' file
    insert_job: 18132_TAL_D_DS_PEAR_AUTORECON   job_type: CMD
    condition: 18132_D_DS_PEAR_AUTORECON
    command: $ADM_BIN/pear_generic_wrapper.ksh
    owner: gpadmin
    permission:
    

    当您使用 awk 时,您永远不需要 sed,而且 awk 不是 shell,它是一个完全独立的工具,具有自己的语言、语法和语义,因此您不应该尝试使用 shell 从中调用其他 UNIX 工具语法。

    【讨论】:

      猜你喜欢
      • 2017-02-08
      • 2014-10-19
      • 2015-01-13
      • 1970-01-01
      • 2019-08-07
      • 2021-12-24
      • 1970-01-01
      • 2019-10-10
      • 2015-10-25
      相关资源
      最近更新 更多