bash - 如何使用带有颜色代码的 *nix 列实用程序?
问题描述
我在 csv 文件中有数据。我写了一个脚本来保存cat
这个文件,并用它column -s, -t
来很好地把它表格化成漂亮的列:
Foosballs Barbells Bazketballs
22 39 14
86 94 37
17 44 28
但是,我想以粗体显示标题行。我可以通过将格式代码直接写入文件来做到这一点。
bold=$(tput bold)
reset=$(tput sgr0)
echo "${bold}Foosballs,Barbells,Bazketballs${reset}" > /path/to/file
这适用于cat
; 当我对文件进行分类时,格式代码会正确显示。但他们搞砸了column -t
:任何彩色/粗体行不再与其他行对齐。
Foosballs Barbells Bazketballs
22 39 14
86 94 37
17 44 28
column -t
将数据排列成列时,是否有某种方法可以忽略颜色代码?(或者有没有更好的方法在列中显示 csv 数据?)
更新:
column
正如一些答案所指出的那样,首先应用格式代码,然后再应用格式代码。但在许多情况下,我想将不同的格式/颜色应用于行中的各个值,而不是整行。这是一个简单的例子:
echo "${underline}foo${reset} ${underline}bar${reset}"
一般来说,我可能想要使用难以或不可能应用事后的任意格式逻辑(即,在我已经打印了该行并调用column -t
它之后)。表格化后的格式化(如查尔斯达菲的回答)是一个很好的开始,但可能并不总是对我有用(至少,方便)。
我总是可以自己编写一个实用程序来执行这种格式代码透明的表格化,但是无论我在哪里工作,我都必须随身携带它。我不想提前知道列宽;我需要一些东西,比如column -t
我可以用任意分隔的数据扔到管道的末端。基本上,我需要一个可以通过 Homebrew 或其他包管理器轻松获得的聪明的单线或第三方实用程序。
总结一下:为了赏金,我正在寻找一种简单、(合理)可移植的方法来表格化以前格式化的数据。
解决方案
一种强制对齐和注入颜色代码的机制是使用printf
:
printf '%s%-20s %-20s %-20s%s\n' "$bold" "Foosballs" "Barbells" "Bazketballs" "$reset"
请注意,我们%s
对颜色代码使用占位符,%-20s
对其他字段使用字符串(20 个字符,左对齐)。这确实意味着您的代码需要负责了解每列所需的长度。
如果你不想这样做,你可以后处理:
generate_data() {
echo "Foosballs,Barbells,Bazketballs"
echo 22,39,14
echo 86,94,28
echo 17,44,28
}
bold=$(tput bold)
reset=$(tput sgr0)
generate_data | column -s, -t | {
IFS= read -r header # read first line
printf '%s\n' "${bold}$header${reset}" # write first line in bold
cat # pass rest of stream through unmodified
}
或者,只为一列着色:
generate_data() { printf '%s\n' "Foosballs,Barbells,Bazketballs" 22,39,14 86,94,28 17,44,28; }
color_column() {
gawk -v column_nr="$1" -v color_start="$2" -v color_end="$3" '
BEGIN { FPAT = "([[:space:]]*[^[:space:]]+)"; }
{ $column_nr = color_start $column_nr color_end; print $0 }
'
}
generate_data | column -s, -t | color_column 2 "$(tput bold)" "$(tput sgr0)"
推荐阅读
- java - 如何对两个 ArrayList 进行排序,同时合并为一个?
- java - java indexof总是返回-1
- c# - 强制窗口重绘
- excel - VBA中的组合框和文本框等于Excel中的单元格
- django - 具有空过滤器值的 Django filter_class
- c++ - MacOS Xcode 链接
- mysql - 当我在 MySQL 中使用 WHERE 调用视图时会发生什么
- python - 树莓派系统启动时自动 git pull
- java - 如果类具有私有构造函数,如何从 Java 配置而不是上下文 bean 创建 bean?
- php - 如何在不编辑第三方类的情况下将 PHP 方法添加到第三方类?