我有一个 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
部分很重要。例如,考虑$1
like值的情况。;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