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

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

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

site1.com,aaa,bbb,ccc
site2.com,qqq
site3.com,rrr,uuu,ppp
site4.com
site5.com,ddd,sss

我想替换第四列为空的行(行)。我想通过在这些行上运行命令来操作这些行。例如,使用awk

awk -F, '$4=="" {system("$1,cmd1 $1")}' test.csv

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

site1.com,aaa,bbb,ccc
site2.com,output1
site3.com,rrr,uuu,ppp
site4.com,output1
site5.com,output1

答案1

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}'

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

答案2

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

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

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

答案3

您可以使用以下代码:

awk -v output1="$(cmd1)" 'BEGIN{FS=OFS=","} NF&&NF<4{print $1,output1}1' file

该选项-v将变量设置output1为 shell 命令的结果cmd1

该语句BEGIN{FS=OFS=","}将分隔符设置为逗号。

如果该行不为空且字段数小于 4,则替换该行。

最后,1触发默认语句awk:打印整行。

答案4

sed -rn '
/\S+,\S+,\S+,\S+/{p;b}      # if all four columns exist, print and branch to end
s/^([^,]+).*/\1/            # else extract first column
h                           # hold
s/.*/echo output &/e        # exeute external command echo with first column as argument
G                           # append previous hold value
s/(.*)\n(.*)/\2,\1/         # arrange position
p' file                     # print result

相关内容