Arrays 如何输出数组';在BASH的列中添加内容

Arrays 如何输出数组';在BASH的列中添加内容,arrays,bash,list,Arrays,Bash,List,我想显示数组中的一长串字符串 现在,我的脚本通过for循环运行,将每个值回显到标准输出: for value in ${values[@]} do echo $value done 是啊,那太难看了!单列列表也很长 我想知道是否可以找到一个命令或内置程序来帮助我在列中显示所有这些值,就像列出目录时默认使用的ls命令(ls-C) [更新] 由于column未显示格式正确的列而失去理智,以下是更多信息: 价值观: $ values=( 01----7 02----7 03-----8 04--

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

现在,我的脚本通过for循环运行,将每个值回显到标准输出:

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'}”列

结果是:

出现了问题…

Tabspaces
在每个值后使用选项卡

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

详细信息

祝你好运

-CVS

您可以通过管道将输出传输到

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

for
中使用循环将值填充到8个字符似乎可以达到以下目的:

for value in "${values[@]}"; do 
    printf "%-8s\n" "${value}"
done | column

以下是一些可以与一起使用的技术,这样您就可以在不使用循环的情况下进行输出:

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


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


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

cat file.txt | xargs printf '%-24s\n' | sed '$p;N;s/\n//;$p;N;s/\n//'
基本上,它将每一行导入printf,printf将其左对齐为一个24个字符宽的空白块,然后通过管道导入sed。sed将展望未来2条线路,并移除线路中断


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

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

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

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


}出于某种原因,
对我不起作用。在我的例子中,我有一个数组

$ 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


我很确定你的意思是
echo-en“$value\t”
+1正确
column
用于列输出,
column-x
用于行输出!这正是我想要的。但结果并不完美:根据字符串的长度,列中有时会有洞。它感觉像是在某个宽度处捕捉列大小(如值之间插入的选项卡),但不考虑最大值长度来计算列的总宽度。
ls
命令确实可以处理这个问题,以获得干净的输出。
printf“%-8s\n”“${value[@]}”列
也可以。很好!尝试了这三种技术,结果大致相同。请看我对@Johnysweb的回答的评论。@Arko:如果没有看到您的数据,就不可能提出任何进一步的建议<代码>列使用制表符,它还根据最长字符串的长度调整列数。我的数据是一个简单的字符串数组,如“值=(一二三四五)”。我一定错过了什么。无法获得格式正确的列。将用更多信息更新问题。@Arko:使用您提供的命令,您的数据非常适合我。我无法准确地再现您的屏幕截图,但在发出
回音之前,我将终端窗口缩小到60个字符宽,并发出
tabs-10
命令,结果很接近。。。列
命令。我正期待您的回答。这个问题是我的电脑特有的。我会尽力找出原因。与此同时,我找到了另一种“方法”来做这件事。。。看看我自己的答案建议:整数比较:
如果(${value}>$longest\u value))
和其他,您可以在其他地方使用
(())
-您也可以在这里:
((列=项宽度/(最长值+2))
((空格缺少=最长值-值+2))
,而不是在
循环中为
回显空格:
printf“%*s”$spaces\u缺失
@Dennis Williamson:已提交更改!我知道
for
循环很尴尬。。。谢谢你的建议!:-)
column
似乎正在努力解决这样一个事实:您的输入只有一列,而某些行比制表位窄<代码>回显“${values[@]/%/$'\n'}”列似乎work@Johnsyweb:我必须在
\n
之前添加另一个空格,以使其能够处理该组数据。但令人遗憾的是,输出仅在3列上。虽然有足够的空间容纳5列。@Arko:SO.com在
\n
之前吞下了我的两倍空间<代码>回显“${values[@]/%/$'\n'}”| column-c 120为我提供了五列。同样,在换行之前将我的空格减半@约翰西韦布:事实上,所以我没有占用你的空间。这是一个HTML功能,默认情况下,多个空格呈现为一个空格。看看来源,他们在那里。这是一个与问题不同的场景。你可能应该把它作为另一个问题发布。这是对我的问题的一个很好的回答
cat file.txt | xargs printf '%-24s\n' | sed '$p;N;s/\n//;$p;N;s/\n//'
(IFS=''; echo "${values[*]/%/$'\n'}") | column
#  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
$ 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