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

时间:2010-06-10 13:41:09

标签: arrays bash list

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

现在,我的脚本通过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'}" | column

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

出了点问题......

7 个答案:

答案 0 :(得分:17)

您可以将输出传输到column

column似乎很难解决单列输入中的某些数据比tabstop(8个字符)更窄的问题。

for循环中使用printf将值填充为8个字符似乎可以解决问题:

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

答案 1 :(得分:4)

以下是一些可以与Johnsyweb's answer一起使用的技术,因此您可以在没有循环的情况下完成输出:

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

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

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

答案 2 :(得分:1)

看起来有些过分,但我提出了自己的解决方案。我编写了一个完全符合我想要的小脚本:获取值列表并在格式相当的列视图中输出它们。

http://github.com/Arko/Columnize

答案 3 :(得分:1)

我知道这是一个老线程,但我从列中得到了不稳定的结果,所以我想我会给出我的解决方案。我想将每3行分成3个均匀间隔的列。

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

基本上,它将每一行管道传输到printf中,然后将其左对齐成一个24个字符宽的空白块,然后通过管道传输到sed。 sed将展望未来2行并删除换行符。

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

答案 4 :(得分:1)

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

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

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

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

#  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

}

答案 5 :(得分:1)

出于某种原因,ReactDOM.render(( <Router history={browserHistory}> <Route path="/" component={Login}/> <Route path="main" component={main}> <IndexRoute component={Home} /> <Route path = "/Accession" component = {Home} /> <Route path="/contact" component={Contact}/> </Route> </Router> ), document.getElementById('App')); 对我不起作用。在我的情况下,我有一个类似

的数组
column

而不是我用

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

答案 6 :(得分:0)

Tabspaces


在每个值后使用标签。

(它也自动流向下一行......)

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

详细信息 here

古德勒克!!
- CVS