Запустить скрипт на выходной переменной конвейера несколько раз

У меня есть команда, которая добавляет вычисляемый столбец в стандартный вывод, и я хотел бы применить переменную N количество раз.

Например, если бы я вводил "hello\nworld\n" и хотел добавить столбец 0, N=3 раза я мог бы ввести следующее:

echo -e 'hello\nworld' | sed 's/$/ 0/' | sed 's/$/ 0/' | sed 's/$/ 0/'

Я пробовал глупые идеи, такие как:

echo -e 'hello\nworld' | (for i in $(seq 1 $N); do echo $(cat) 0; done)

а также

echo -e 'hello\nworld' | (for i in $(seq 1 $N); do sed 's/$/ 0/'; done)

но ясно, что они не замыкают конвейер.

Любые идеи?


person Jon    schedule 13.11.2015    source источник


Ответы (2)


Это легко сделать с помощью рекурсии:

repeat() {
  count="$1"
  shift
  if [ "$count" -ge 1 ]
  then
    "$@" | repeat "$((count-1))" "$@"
  else
    cat
  fi
}

Примеры:

$ echo foo | repeat 0 sed 's/$/ 0/'
foo
$ echo foo | repeat 1 sed 's/$/ 0/'
foo 0
$ echo foo | repeat 3 sed 's/$/ 0/'
foo 0 0 0
person that other guy    schedule 13.11.2015

Итак, вы хотите добавить значение 0 кратное N = 3 раза:

awk -v value="0" -v N=3 \
    '{printf "%s", $0; for (i = 0; i < N; i++) printf " %s", value; print "" }'

Передайте значение и количество повторений как переменные в awk. Для каждой строки выведите ввод; затем добавьте N копий значения; затем испустите новую строку.

Вы можете использовать OFS (разделитель полей вывода) вместо пробелов, чтобы разделить вывод в цикле:

printf "%s%s", OFS, value;
person Jonathan Leffler    schedule 13.11.2015