我有一些使用管道的shell脚本,例如以下内容:
foo.sh | bar.sh
我的
bar.sh
调用了一些命令行程序,该程序只能处理特定数量的标准输入行。因此,我希望将foo.sh
的大型标准输出分成N行,以进行多个bar.sh
调用。本质上,对foo.sh
的标准输出进行分页,并执行多个bar.sh
。这是否可能?我希望在管道中间有一些魔法,就像
foo.sh | ??? | bar.sh
一样。 xargs -n
并不能完全满足我的需求。我没有机器来测试,但是您需要使用GNU Parallel
使这更容易实现,大致如下:
foo.sh | parallel --pipe -N 10000 -k bar.sh
bar.sh
。bar.sh
,请添加-j 1
。--dry-run
。while read
循环。foo.sh | while read line1 && read line2 && read line3; do
printf "%s\n%s\n%s\n" "$line1" "$line2" "$line3" | bar.sh
done
read_n_lines() {
read -r line || return 1
echo "$line"
n=$(($1 - 1))
while [[ $n -gt 0 ]] && read -r line; do
echo "$line"
n=$((n-1))
done
}
n=20
foo.sh | while lines=$(read_n_lines $n); do
printf "%s\n" "$lines" | bar.sh
done
while
条件,但我宁愿不这样做。有没有可能不必编写N个谓词? - Stephen Chu
head
命令。 - anishsanebar.sh
处理多行数据。 - Barmar