在管道输出上运行脚本变量次数

时间:2015-11-13 23:18:31

标签: bash pipeline

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

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

使用递归很容易做到:

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

答案 1 :(得分:0)

因此,您希望将值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;