【问题标题】:Bash function to draw array of coordinatesBash函数绘制坐标数组
【发布时间】:2019-08-06 13:03:01
【问题描述】:

使用给定的下划线分隔坐标数组(如: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 秒。有没有更好更快的方法来做到这一点?

【问题讨论】:

    标签: bash tput


    【解决方案1】:

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

    draw() {
        clear
        for i; do
            y=${i%_*}
            x=${i#*_}
            tput cup $x $y && printf "█"
        done
    }
    

    【讨论】:

    • 这是一个很棒的优化!我也想知道加快 tput 线的速度,但如果没有什么能更快,我会将此标记为答案
    • 您可以使用printf '\e[%d;%dH█' "$y" "$x" 代替tputprintf '\e[2J' 代替clear。然后代码将完全无分叉
    • @thatotherguy - 这些 printf 命令正是我要找的,速度快如闪电!
    • Printf 肯定更快,但不太可靠。例如,我的 macos 上的 tput cup 5 8 等价于 printf '\e[%d;%dH' 6 9
    【解决方案2】:

    你能用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 2017-09-22
      • 2023-01-17
      • 2021-06-23
      相关资源
      最近更新 更多