运行 管道输出可变次数的脚本
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;
我有一个命令将计算列附加到标准输出,我想将变量应用 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;