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

Вам нужно использовать ssh -n, иначе успешный ssh потребляет стандартный ввод и вашему while циклу нечего читать.

5
13.12.2016, 11:34
5 ответов
awk -F, '{ if ( $4 == "" ){printf "%s,",$1 ; system(CMD) ;}else {print $0}}' test.csv

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

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

1
27.01.2020, 20:37

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

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

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

Оператор BEGIN {FS = OFS = ","} устанавливает в качестве разделителя запятую.

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

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

1
27.01.2020, 20:37
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.

5
27.01.2020, 20:37

возможно, этот пост поможет вам 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
0
27.01.2020, 20:37
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
0
27.01.2020, 20:37

Теги

Похожие вопросы