如何使用基于运行命令的 sed 或 awk 替换特定行

alr*_*lrz 5 sed awk text-processing

我有一个 csv 文件,如下所示:

site1.com,aaa,bbb,ccc
site2.com,qqq
site3.com,rrr,uuu,ppp
site4.com
site5.com,ddd,sss
Run Code Online (Sandbox Code Playgroud)

我想替换第四列为空的行(行)。我想通过对它们运行命令来操纵所述行。例如,使用awk

awk -F, '$4=="" {system("$1,cmd1 $1")}' test.csv
Run Code Online (Sandbox Code Playgroud)

然后我想导出如下(output1是从cmd1命令输出):

site1.com,aaa,bbb,ccc
site2.com,output1
site3.com,rrr,uuu,ppp
site4.com,output1
site5.com,output1
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 5

awk -F, -v q=\' '
  function shellquote(s) {
    gsub(q, q "\\" q q, s)
    return q s q
  }
  $4 == "" {
    printf "%s,", $1
    system("cmd " shellquote($1))
    next
  }
  {print}'
Run Code Online (Sandbox Code Playgroud)

shellquote部分是很重要的。例如,考虑值为$1like;reboot的情况。


Wis*_*lah 1

awk -F, '{ if ( $4 == "" ){printf "%s,",$1 ; system(CMD) ;}else {print $0}}' test.csv
Run Code Online (Sandbox Code Playgroud)

如果第四个字段为空,则打印第一个字段以及命令的输出,否则打印孔线。

但请注意命令的输出将如何打印