我在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
。
答案 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"
每列颜色不同的情况更复杂:
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
)"
并使标题变为粗体,只需将以下代码\e[1m
添加到echo
命令中:
...
B='\e[1m'
echo -e "$B$(
awk -F "$s" \
...
)"