代码之家  ›  专栏  ›  技术社区  ›  Arko

如何在BASH的列中输出数组的内容

  •  9
  • Arko  · 技术社区  · 14 年前

    我想显示数组中的一长串字符串。

    for value in ${values[@]}
    do
      echo $value
    done
    

    是啊,真难看!单列列表也很长。。。

    我想知道是否可以找到一个命令或内置程序来帮助我在列中显示所有这些值,比如 ls ls -C

    [更新]

    失去理智 column

    价值观:

    $ values=( 01----7 02----7 03-----8 04----7 05-----8 06-----8 07-----8 08-----8 09---6 10----7 11----7 12----7 13----7 14-----8 15-----8 16----7 17----7 18---6 19-----8 20-----8 21-----8)
    

    命令: echo " ${values[@]/%/$'\n'}" | column

    bad columns http://tychostudios.ch/multipurpose/bad_columns.png

    出了点问题。。。

    7 回复  |  直到 4 年前
        1
  •  23
  •   johnsyweb    12 年前

    你可以把你的输出输送到 column .

    似乎很难处理单列输入中的某些数据比tabstop(8个字符)窄。

    使用 printf 在一个 for

    for value in "${values[@]}"; do 
        printf "%-8s\n" "${value}"
    done | column
    
        2
  •  4
  •   Community kfsone    7 年前

    以下是一些可以用于 Johnsyweb's answer 因此,您可以在不使用循环的情况下执行输出:

    saveIFS=$IFS
    IFS=$'\n'
    echo "${values[*]}" | column
    IFS=$saveIFS
    

    echo " ${arr[@]/%/$'\n'}" | column
    

    echo " ${arr[@]/%/$'\n'}" | sed 's/^ //' | column
    
        3
  •  2
  •   jimmetry    12 年前

    我知道这是一个旧的线程,但我得到了不稳定的结果从专栏,所以我想我应该给我的解决方案。我想把每3行分成3个等距的列。

    cat file.txt | xargs printf '%-24s\n' | sed '$p;N;s/\n//;$p;N;s/\n//'
    

    N命令将下一行读入当前缓冲区,s/\N//删除换行符。简而言之,我们想要的是N;N;s/\n//g',在某些情况下会起作用。问题是,如果缓冲区中没有多余的两行,sed将突然退出。$p命令通过说“如果这是最后一行,请立即打印缓冲区内容”来预先设置。

        4
  •  1
  •   Arko    14 年前

    这看起来有些过分,但我想出了自己的解决办法。我写了一个小脚本,它完全实现了我想要的:获取一个值列表,并在一个非常格式化的列视图中输出它们。

    http://github.com/Arko/Columnize

        5
  •  1
  •   Dan Miner    10 年前

    我知道这是一个旧线程,但我遇到了同样的情况。最后我结合了这里的一些想法。

    对于基于列实用程序的解决方案(没有初始空间问题):

    (IFS=''; echo "${values[*]/%/$'\n'}") | column
    

    使用@Arko的脚本作为基础,可以处理带有空格的值。注意printf规范%-*s表示左对齐列,右对齐列将删除“-”。我没有包括我的终端猜测,但它是可设置的(终端宽度)。

    #  e.g.  column "$@"
    #        spacing=4 column "$@"
    #        left=6 spacing=3 column "$@"
    #
    function column() {
        local leftMargin=${left:-0}
        local padding=${spacing:-2}
        local maxWidth=$(( ${terminalWidth:-80} - $leftMargin ))
        local values=("$@")
        local max=$(( $(IFS=''; echo "${values[*]/%/$'\n'}" | wc -L) + $padding ))
        local cols=$(( $maxWidth / $max ))
    
        local pos=0 NL=''
        for value in "${values[@]}"; do
            [[ $pos == 0 ]] && {
                printf "$NL%*s" "$leftMargin"
                NL=$'\n'  # add newlines from now on...
            }
            printf "%-*s" "$max" "$value"
            (( pos = ($pos + 1) % $cols ))
        done
        echo
    

        6
  •  1
  •   Manfredo    8 年前

    因为某种原因 column 不适合我。在我的例子中,我有一个数组

    $ array = ( 1 2 3 dir1 dir2 dir3 )
    $
    $ echo ${array[@]} | column            
    1 2 3 dir1 dir2 dir3
    

    $ echo ${array[@]} | tr ' ' '\n' | sort
    1
    2
    3
    dir1
    dir2
    dir3
    
        7
  •  0
  •   TheCodeArtist    14 年前

    制表符空间


    在每个值后面使用制表符。

    (它也会自动流到下一行…)

    for value in ${values[@]}
    do
      echo -en "$value\t"
    done
    

    here

    祝你好运!!
    -简历