1

使用给定的下划线分隔坐标数组(如:)5_2 4_5 1_3,我需要一个快速 bash 函数来在终端屏幕上的这些位置绘制一个块字符。现在我有这个:

function draw() {
    clear
    for i in $(echo $@); do
        y=$(echo $i | cut -d '_' -f1)
        x=$(echo $i | cut -d '_' -f2)
        tput cup $x $y && printf "█"
    done
}

这个功能很好,但是它相当慢 - 使用 8 个坐标执行它需要 0.158 秒。有没有更好更快的方法来做到这一点?

4

2 回答 2

3

我不知道这真的是一个好主意,但是这个重构在我的盒子上运行的速度大约是原来的两倍:

draw() {
    clear
    for i; do
        y=${i%_*}
        x=${i#*_}
        tput cup $x $y && printf "█"
    done
}
于 2019-08-06T00:35:00.203 回答
1

你能打败这个awk吗?:

#!/usr/bin/env bash

coords=( 5_2 4_5 1_3 )

awk 'BEGIN{RS=" ";FS="_"}{printf("\x1B[%d;%dH█",$1+1,$2+1)}' <<<"${coords[@]}"

或者使用 POSIX shell:

#!/usr/bin/env sh

coords="5_2 4_5 1_3"

printf '%s\n' $coords | awk -F_ '{printf("\x1B[%d;%dH█",$1+1,$2+1)}'

如果coords.txt文件中有坐标:

5_2
4_5
1_3

一条线将在坐标处绘制您的块

awk -F_ '{printf("\x1B[%d;%dH█",$1+1,$2+1)}' <coords.txt
于 2019-08-06T04:41:59.630 回答