我有一些输出,每行打印一个元素。我希望能够以 N 为块来解析该输出,即使行数不是 N 的倍数。
find . -f | chunk 10 1 # shows first chunk of size 10
find . -f | chunk 10 2 # second chunk of size 10
find . -f | chunk 10 3 # last of size < n
find . -f | chunk 10 4 # does nothing
答案1
您的块函数可以在 bash 中按如下方式实现。
chunk(){
size=$1
n=$2
firstline=$((n*size))
i=0
while [ $i -lt $firstline ]
do
read -r junk || return
i=$((i+1))
done
i=0
while [ $i -lt $size ]
do
read -r str || return
printf "%s\n" "$str"
i=$((i+1))
done
}
请注意,如果在调用 之间添加文件,结果可能会出乎意料find
。因此,您可能需要实现save_chunks
/ get_chunk
API 而不是您请求的 API,或者执行以下操作:
catn(){
i=0
while [ $i -lt $1 ] && read -r s
do printf "%s\n" "$s";i=$((i+1))
done
}
find -f . |
(catn 10; # shows first chunk of size 10
catn 10; # second chunk of size 10
catn 10; # last of size < n
catn 10) # does nothing
这也应该更快。