运行 管道输出可变次数的脚本

Run script on pipeline output variable number of times

我有一个命令将计算列附加到标准输出,我想将变量应用 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)

但显然这些并没有链接管道。

有什么想法吗?

这很容易通过递归完成:

repeat() {
  count=""
  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

所以你想附加一个 0 的 N = 3 倍的值:

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

将值和重复计数作为变量传递给 awk。对于每一行,打印输入;然后添加该值的N个副本;然后发出换行符。

您可以使用 OFS(输出字段分隔符)代替空格来分隔循环中的输出:

printf "%s%s", OFS, value;