Как заменить определенную строку с помощью sed или awk на основе команды run

У меня есть файл 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 

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

Если четвертая подана пустая, напечатайте первое поле с выходом команды, иначе распечатайте линию отверстия.

Но имейте в виду вывод команды, как она будет печатать

 awk -F, -vq=\' ' function shellquote(s) { gsub(q, q "\\" qq, s) return qsq } $4 == "" { printf "%s,", $1 system("cmd " shellquote($1)) next } {print}' 

shellquote часть shellquote . Рассмотрим случай значения $1 например ;reboot .

Вы можете использовать следующий код:

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

Опция -v устанавливает переменную output1 в результате команды оболочки cmd1 .

Заявление BEGIN{FS=OFS=","} задает разделитель запятой.

Если строка не пуста и число полей меньше 4, замените строку.

Наконец, 1 запускает инструкцию по умолчанию в awk : печатает всю строку.

может быть, это сообщение поможет вам https://stackoverflow.com/questions/20646819/how-can-i-pass-variables-from-awk-to-a-shell-command

 $ cat input.txt a,b,c,d a,b a,b,c,d a,b,c a,b,c,d $ awk -F, 'NF<4{cmd="echo output1";while(cmd|getline line){printf("%s,%s\n",$0,line)};close(cmd);next}1' input.txt a,b,c,d a,b,output1 a,b,c,d a,b,c,output1 a,b,c,d 
 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