2013-11-22 72 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