在列中打印 list/array

Print list/array in columns

我有 list/array,例如 $PATH 环境变量,当您执行 echo $PATH 时,它会打印

/usr/local/bin /usr/bin /bin /usr/sbin /sbin /opt/X11/bin /usr/local/MacGPG2/bin /usr/texbin /usr/local/go/bin

我希望将其格式化为如下所示的列,因此不必向上向下滚动太多。 $PATH 变量只是一个示例,我希望能够对任何列表执行此操作。

/usr/local/bin /usr/sbin    /usr/local/MacGPG2/bin
/usr/bin       /sbin        /usr/texbin
/bin           /opt/X11/bin /usr/local/go/bin

我可以使用 for 循环在新行中打印列表中的每个项目,但想不出一种方法来处理多列。我知道有一个列命令,但它似乎没有做任何事情。我已经尝试了所有选项,例如 echo $PATH | column -c 5

试试这个:

echo $PATH|sed 's/ /\
/g'|column -xt -c5

注意:在\之后一定要换行

给你:传入一个变量名称和你想要的列数

$ function columnize -a listvarname -a ncols
      test (count $ncols) -eq 1; or set ncols 1
      printf "%s\n" $$listvarname | \
      eval paste (yes - | head -n $ncols | tr '\n' " ") | \
      column -t
  end 

使用非特殊列表名称的演示。

$ set list /usr/local/bin /usr/bin /bin /usr/sbin /sbin /opt/X11/bin /usr/local/MacGPG2/bin /usr/texbin /usr/local/go/bin

$ columnize list 3
/usr/local/bin          /usr/bin     /bin
/usr/sbin               /sbin        /opt/X11/bin
/usr/local/MacGPG2/bin  /usr/texbin  /usr/local/go/bin

$ columnize list 5
/usr/local/bin  /usr/bin                /bin         /usr/sbin          /sbin
/opt/X11/bin    /usr/local/MacGPG2/bin  /usr/texbin  /usr/local/go/bin

$ columnize list 
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/opt/X11/bin
/usr/local/MacGPG2/bin
/usr/texbin
/usr/local/go/bin