首页 > 解决方案 > 如何使用带有颜色代码的 *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 或其他包管理器轻松获得的聪明的单线或第三方实用程序。

总结一下:为了赏金,我正在寻找一种简单、(合理)可移植的方法来表格化以前格式化的数据

标签: bashcsvunix

解决方案


一种强制对齐注入颜色代码的机制是使用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)"

推荐阅读