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

по желанию. Теперь я хочу добавить цвета в столбцы. Я попытался добавить escape-коды вокруг каждого поля с разделителями табуляции в исходном файле. 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

Приходите на сегодня. Завтра будет больше копаться. Должно быть решение. (Вы могли бы использовать еще один * могучий язык, например, python или perl, конечно. Но awk + столбец должен работать .. не знаю почему) – 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 для форматирования вывода, а также:

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' :) .. Но в aligment еще не все. Вы должны перейти к 'column' – hek2mgl

+3

Все еще не работает с конвейером' column' ...Я думаю, что проблема здесь в том, что 'column' срабатывает по цветовым кодам, а не самой цветопередаче. –

+0

POST отредактирован соответствующим образом. –

3

Я написал версию Баша столбца (по аналогии с одним из 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, и он работает! К сожалению, не так быстро, как столбец. Здесь идет время: column2 сделал 0.706s/0.599s/0.612s/0.622s, в то время как исходная колонка делала 0.012s/0.009s/0.009s/0.010s. Это имеет значение, когда пользователь ждет отображения информации. Но ... поскольку столбец не будет работать с цветовыми кодами, я продолжу использовать color2 и +1 для автора. –

+0

Блестящий! Могу ли я использовать это в проекте с открытым исходным кодом, над которым я работаю? Я только что отправил вам письмо с дополнительной информацией :) – mfnalex

Смежные вопросы