Вам нужно использовать ssh -n
, иначе успешный ssh
потребляет стандартный ввод и вашему while
циклу нечего читать.
awk -F, '{ if ( $4 == "" ){printf "%s,",$1 ; system(CMD) ;}else {print $0}}' test.csv
Если четвертый файл пуст, выведите первое поле с выводом команды, иначе выведите дырявую строку.
Но будьте внимательны к выводу команды, как она будет печатать
Вы можете использовать следующий код:
awk -v output1="$(cmd1)" 'BEGIN{FS=OFS=","} NF&&NF<4{print $1,output1}1' file
Параметр -v
устанавливает переменную output1
как результат команды оболочки cmd1
.
Оператор BEGIN {FS = OFS = ","}
устанавливает в качестве разделителя запятую.
Если строка не пуста и количество полей меньше 4, замените строку.
Наконец, 1
запускает оператор по умолчанию в awk
: распечатать всю строку.
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
, например, ;reboot
.
возможно, этот пост поможет вам 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