关联数组管道到列命令

时间:2017-11-18 17:28:32

标签: bash

我正在寻找一种使用column命令打印出一个关联数组的方法,我填写就像有可能有办法做到这一点,但我没有多少运气。

declare -A list
list=(
  [a]="x is in this one"
  [b]="y is here"
  [areallylongone]="z down here"
)

我希望结果是一张简单的表格。我已经使用了带有标签的循环,但在我的情况下,长度足以抵消第二列。

输出应该看起来像

a               x is in this one
b               y is here
areallylongone  z down here

3 个答案:

答案 0 :(得分:3)

您正在寻找类似的东西吗?

declare -A assoc=(
  [a]="x is in this one"
  [b]="y is here"
  [areallylongone]="z down here"
)

for i in "${!assoc[@]}" ; do
    echo -e "${i}\t=\t${assoc[$i]}"
done | column -s$'\t' -t

输出:

areallylongone  =  z down here
a               =  x is in this one
b               =  y is here

我使用tab char分隔键和值,并使用column -t将输出列表,-s将输入分隔符设置为tab char。来自man column

  

-t确定输入包含的列数并创建表。默认情况下,列用空格分隔,或者用字符分隔                使用-s选项提供的ters。适用于漂亮的打印显示

     

-s指定一组字符,用于分隔-t选项的列。

答案 1 :(得分:1)

一种(简单)方法是通过将键列和值列粘贴在一起

paste -d $'\t' <(printf "%s\n" "${!list[@]}") <(printf "%s\n" "${list[@]}") | column -s $'\t' -t

对于您的输入,它产生:

areallylongone  z down here
a               x is in this one
b               y is here

为了处理(两个)键和值中的空格,我们在TAB\t选项)和{{paste中使用-dcolumn)作为列分隔符1}}(-s选项)命令。

答案 2 :(得分:0)

从hek2mgl

的答案中获得所需的输出
 declare -A assoc=(
  [a]="x is in this one"
  [b]="y is here"
  [areallylongone]="z down here"
  )
for i in "${!assoc[@]}" ; do
  echo "${i}=${assoc[$i]}"
done | column -s= -t | sort -k 2