2015-11-13 66 views
0

我有一个命令将计算列附加到标准输出,我想应用变量N次数。在管道输出变量上运行脚本次数

例如,如果我输入的是“你好\ 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="$1" 
    shift 
    if [ "$count" -ge 1 ] 
    then 
    "[email protected]" | repeat "$((count-1))" "[email protected]" 
    else 
    cat 
    fi 
} 

例子:

回答

1

这很容易用递归方法来实现

$ 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

所以要追加的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;