使用column -t打印两个bash数组

时间:2016-06-30 02:33:42

标签: arrays bash

据我所知,有多种方法可以使用while或for循环以及awk,echo,printf等输出漂亮的列。我正在寻找的是一种简单直观的方式(不凌乱),可以轻松地使用column(1)命令和两个bash数组。

我找到了以下Q& A:How can I format the output of a bash command in neat columns

说明了如何非常清楚地使用column,但问题是关于bash命令并给出一个命令/字符串作为示例。

我的方案是 - 我有两个bash数组(in_dblocal)。 in_db[$i]条目是YN,如果{my}}条目在我的mysql数据库中。我想将local[$i]数组的条目作为第一列,将in_db数组的条目作为第二列。两列将具有相同数量的条目/行。我不想将任何输出打印到文件中。

我试过了:

local

其中column -x -s "**" -t <<< (echo ${in_db[@]}; echo ${local[@]})中的条目在字符串末尾有一个in_db,用于分隔第一列的结尾。我在**中对-x标志的假设是它将在第一列中首先打印所有column条目(因此我首先打印in_db)。我知道上面的in_db命令不符合我的喜好,我显然错过了对column标志的描述的解释。我正在尝试不同的场景和标志,以使其正确打印。

我也尝试过,而不是使用两个单独的数组,在-x数组中添加来自local的字符串:

in_db

这打印为一行:

i=0 local_count=${#local[@]} while [ $i -lt $local_count ]; do q=$(mysql --defaults-extra-file="/tmp/my.cnf" mp3s \ -e "select folder_location from folders where folder_location = \"${local[$i]}/\"" -s -N) if [[ -z $q ]]; then local[$i]="N**${local[$i]}" else local[$i]="Y**${local[$i]}" fi i=$((i+1)) done echo ${local[@]} | column -s "**" -t

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

假设我们有两个数组。例如:

in_db=(Y N Y N)
local=(one two three four)

将它们整齐地打印在两列中:

$ paste <(printf "%s\n" "${local[@]}") <(printf "%s\n" "${in_db[@]}")
one     Y
two     N
three   Y
four    N

如您所见,column并非真的需要,但如果您愿意,我们可以使用它:

$ paste <(printf "%s\n" "${local[@]}") <(printf "%s\n" "${in_db[@]}") | column -t
one    Y
two    N
three  Y
four   N

如何运作

paste允许我们一次一行地合并两个或多个文件。默认情况下,这些行与制表符组合作为分隔符。

由于您想要组合数组而不是文件,我们必须将数组转换为类文件对象。我们使用bash的流程替换功能来实现这一点。在bash中,<(...)创建一个类似文件的对象。 &#34;文件的内容&#34;不管是parens里面命令的输出是什么。在这种情况下,我们使用printf将每个数组格式化为每行一个项目。