2013-11-22 44 views
8

我有一个制表符分隔的文本文件,我发送到column以“漂亮地打印”表格。漂亮的印刷色列中的颜色转义代码

原始文件:

1<TAB>blablablabla<TAB>aaaa bbb ccc 
2<TAB>blabla<TAB>xxxxxx 
34<TAB>okokokok<TAB>zzz yyy 

使用column -s$'\t' -t <original file>,我得到

1 blablablabla aaaa bbb xxx 
2 blabla  xxxxxx 
34 okokokok  zzz yyy 

达到目标。现在我想给列添加颜色。我试图在原始文件中每个制表符分隔的字段周围添加转义码。 column成功地以彩色打印,但列不再对齐。相反,它只是逐字打印TAB分隔符。

问题是:我怎样才能让列对齐,但也与独特的颜色?

我想到了两种方法来实现这一目标:

  1. 调整column参数,使与颜色代码比对工作
  2. 重定向柱的输出到另一个文件,并做了搜索+取代前两个空格分隔的字段(前两列都保证包含空格;第三列最有可能将包含空格,但没有TAB字符)

问题是,我不知道该怎么做或者这两个的...

仅供参考,这里就是我传递给column

Original file with color codes

注意,字段的确由TAB字符分隔。我已经用od确认了这一点。

编辑:

似乎没有要与着色的问题。我已经有了上面显示的颜色代码工作的文件。问题是column将不会对齐,一旦我发送输入与转义码。我想通过而不是颜色代码到column,然后复制每个字段之间输出的确切数量的空格column,并在漂亮的打印方案中使用它。

+0

我想这仅仅使用“列-t my_file”,并没有看到有对齐任何问题。 –

+0

如果FIELD3中有空格,除非您指定不同的分隔符,否则它将不起作用。即使如此,即使它们不包含空格,前两列也没有对齐。以下是'column -t my_file'的结果:http://i.imgur.com/w6i1aGn.png –

+0

今天必须离开。明天我们会更多地了解这一点..必须有解决方案。 (当然你可以使用更多的* mighty *语言,比如python或perl,但是awk + ​​column应该可以工作..不知道为什么) – hek2mgl

回答

2

我会使用awk用于彩色化(sed可以用作阱):

awk '{printf "\033[1;32m%s\t\033[00m\033[1;33m%s\t\033[00m\033[1;34m%s\033[00m\n", $1, $2, $3;}' a.txt 

和管它column用于对准:

... | column -s$'\t' -t 

输出:

output

+0

你如何保留'column'完成的间距?从你的'awk'命令,它看起来像一个静态数量的空间。 –

+0

@EvanW检查更新..错过了 – hek2mgl

+0

如果我明白了,那'awk'命令将产生与我上面发布的文件相同的输出...但是我已经尝试将它发送到'column'并且它不对齐正确与转义码。 –

2

使用printf格式化输出中以及A液:

while IFS=$'\t' read -r c1 c2 c3; do 
    tput setaf 1; printf '%-10s' "$c1" 
    tput setaf 2; printf '%-30s' "$c2" 
    tput setaf 3; printf '%-30s' "$c3" 
    tput sgr0; echo 
done < file 

enter image description here

+0

+1''tput'命令用法:) ..但对齐方式还不行。你应该管到'列' – hek2mgl

+3

仍然不能管道到'列'...我认为这里的问题是'列'跳到颜色代码上,而不是颜色本身。 –

+0

POST相应编辑。 –

3

我写柱的一个bash版本(一个类似于从util的Linux的),其与颜色代码的工作原理:

#!/bin/bash 
which sed >> /dev/null || exit 1 

version=1.0b 
editor="Norman Geist" 
last="04 Jul 2016" 

# NOTE: Brilliant pipeable tool to format input text into a table by 
# NOTE: an configurable seperation string, similar to column 
# NOTE: from util-linux, but we are smart enough to ignore 
# NOTE: ANSI escape codes in our column width computation 
# NOTE: means we handle colors properly ;-) 

# BUG : none 

addspace=1 
seperator=$(echo -e " ") 
columnW=() 
columnT=() 

while getopts "s:hp:v" opt; do 
    case $opt in 
s) seperator=$OPTARG;; 
p) addspace=$OPTARG;; 
v) echo "Version $version last edited by $editor ($last)"; exit 0;; 
h) echo "column2 [-s seperator] [-p padding] [-v]"; exit 0;; 
*) echo "Unknow comandline switch \"$opt\""; exit 1 
    esac 
done 
shift $(($OPTIND-1)) 

if [ ${#seperator} -lt 1 ]; then 
    echo "Error) Please enter valid seperation string!" 
    exit 1 
fi 

if [ ${#addspace} -lt 1 ]; then 
    echo "Error) Please enter number of addional padding spaces!" 
    exit 1 
fi 

#args: string 
function trimANSI() 
{ 
    TRIM=$1 
    TRIM=$(sed 's/\x1b\[[0-9;]*m//g' <<< $TRIM); #trim color codes 
    TRIM=$(sed 's/\x1b(B//g'   <<< $TRIM); #trim sgr0 directive 
    echo $TRIM 
} 

#args: len 
function pad() 
{ 
    for ((i=0; i<$1; i++)) 
    do 
echo -n " " 
    done 
} 

#read and measure cols 
while read ROW 
do 
    while IFS=$seperator read -ra COLS; do 
ITEMC=0 
for ITEM in "${COLS[@]}"; do 
    SITEM=$(trimANSI "$ITEM"); #quotes matter O_o 
    [ ${#columnW[$ITEMC]} -gt 0 ] || columnW[$ITEMC]=0 
    [ ${columnW[$ITEMC]} -lt ${#SITEM} ] && columnW[$ITEMC]=${#SITEM} 
    ((ITEMC++)) 
done 
columnT[${#columnT[@]}]="$ROW" 
    done <<< "$ROW" 
done 

#print formatted output 
for ROW in "${columnT[@]}" 
do 
    while IFS=$seperator read -ra COLS; do 
ITEMC=0 
for ITEM in "${COLS[@]}"; do 
    WIDTH=$((${columnW[$ITEMC]} + $addspace)) 
    SITEM=$(trimANSI "$ITEM"); #quotes matter O_o 
    PAD=$(($WIDTH-${#SITEM})) 

    if [ $ITEMC -ne 0 ]; then 
    pad $PAD 
    fi 

    echo -n "$ITEM" 

    if [ $ITEMC -eq 0 ]; then 
    pad $PAD 
    fi 

    ((ITEMC++)) 
done 
    done <<< "$ROW" 
    echo "" 
done 

实例:

bold=$(tput bold) 
normal=$(tput sgr0) 
green=$(tput setaf 2) 

column2 -s § << END 
${bold}First Name§Last Name§City${normal} 
${green}John§Wick${normal}§New York 
${green}Max§Pattern${normal}§Denver 
END 

输出例如:

enter image description here

+0

我试过column2,它的工作原理!不幸的是没有列速度那么快。这里是时间:第2列做了0.706s/0.599s/0.612s/0.622s,而原始列做了0.012s/0.009s/0.009s/0.010s。 当用户等待显示信息时,它会有所不同。但....因为列不能用于颜色转义码,所以我会继续使用color2和+1给作者。 –

+0

太棒了!我可以在我正在开发的一个开源项目中使用它吗?我刚刚给你发了一封有更多信息的邮件:) – mfnalex