如何将* nix列实用程序与颜色代码一起使用?

时间:2018-07-10 20:28:05

标签: bash csv unix

我在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

这对猫很好用;整理文件时,颜色/粗体代码正确显示。但是它们搞砸了column -t:任何彩色/粗体的行都不再与其他行对齐。

在将数据排列到列中时,是否有某种方法可以使column -t忽略颜色代码? (或者是否有更好的方式在列中显示csv数据?)

编辑:某些答案指出,先应用column,然后再应用颜色代码。但是,在单独的列中分别应用颜色仍然很棘手,但是在某些情况下我也想这样做。我仍然希望有一种方法可以先应用颜色,然后再应用column

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

对于此测试文件:

$ cat file
Foosballs,Barbells,Bazketballs
22,39,14
86,94,28

简单方法:

d='\e[0m'  #default env
r='\e[31m' #red   color

printf "$r"; column -s, -t file; printf "$d"

enter image description here

每列颜色不同的情况更复杂:

s=','       #delimiter
d='\\e[0m'  #default env
r='\\e[31m' #red   color
g='\\e[32m' #green color
b='\\e[34m' #blue  color

echo -e "$(
awk  -F $s     \
     -v s="$s" \
     -v d="$d" \
     -v r="$r" \
     -v g="$g" \
     -v b="$b" \
     '{ print  r $1 s g $2 s b $3 d }' file | column -s$s -t
)"

enter image description here

并使标题变为粗体,只需将以下代码\e[1m添加到echo命令中:

...
B='\e[1m'

echo -e "$B$(
awk  -F "$s" \
...
)"

enter image description here