据我所知,有多种方法可以使用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_db
和local
)。 in_db[$i]
条目是Y
或N
,如果{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
有什么想法吗?
答案 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
将每个数组格式化为每行一个项目。