使用 grep/head/awk/sed/etc 分块屏幕输出

使用 grep/head/awk/sed/etc 分块屏幕输出

我有一些输出,每行打印一个元素。我希望能够以 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_chunkAPI 而不是您请求的 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 

这也应该更快。

相关内容