2013-11-22 13 views
8

Mam plik tekstowy rozdzielany tabulatorami, który przesyłam do column, aby "ładnie wydrukować" tabelę.Kody ucieczki kolorów w dość drukowanych kolumnach

oryginalny plik:

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

Korzystanie column -s$'\t' -t <original file>, mam

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

jako pożądany. Teraz chcę dodać kolory do kolumn. Próbowałem dodać kody escape wokół każdego pola rozdzielanego tabulatorami w oryginalnym pliku. column z powodzeniem drukuje w kolorze, ale kolumny nie są już wyrównane. Zamiast tego po prostu drukuje separatory TAB dosłownie.

Pytanie brzmi: w jaki sposób mogę ustawić kolumny wyrównane, ale także z unikalnymi kolorami?

myślałem dwóch sposobów na osiągnięcie tego:

  1. Dostosuj parametry column aby uczynić pracę wyrównania z kodami kolorów
  2. przekierować wyjście kolumny do innego pliku, a nie wyszukiwania + wymienić na pierwszych dwóch pól białych rozdzielany (pierwsze dwie kolumny są gwarantowane nie zawierać spacji, trzecia kolumna najprawdopodobniej będzie zawierać spacje, ale nie ma żadnych znaków TAB)

Problem w tym, że nie jestem pewien jak to zrobić albo z tych dwóch ...

Dla porównania, tutaj jest to, co ja przechodząc do column:

Original file with color codes

Zauważ, że pola są rzeczywiście oddzielone znakami TAB. Potwierdziłem to pod numerem od.

edit:

Tam nie wydaje się być problemem z koloryzacji. Mam już plik pokazany powyżej z działającymi kodami kolorów. Problem jest następujący: column nie wyrówna się po wysłaniu przez niego danych wejściowych za pomocą kodów escape. Zastanawiam się nad przekazaniem pól bez kodów kolorów do column, a następnie skopiowanie dokładnej liczby spacji column danych wyjściowych między poszczególnymi polami i użycie ich w ładnym schemacie drukowania.

+0

próbowałem to przy użyciu tylko „kolumny -t my_file” i nie widzę żadnego problemu z wyrównania. –

+0

Jeśli FIELD3 zawiera spacje, nie będzie działać, dopóki nie zostanie określony inny separator. Mimo to moje nie wyrównuje dwóch pierwszych kolumn, nawet jeśli nie zawierają spacji. Oto wyniki 'kolumny -t mój_plik': http://i.imgur.com/w6i1aGn.png –

+0

Muszę wyjść na dziś. Jeszcze jutro zagłębię się w to ... Musi znaleźć rozwiązanie. (Można użyć bardziej * potężnego * języka jak python lub perl oczywiście, ale kolumna awk + powinna działać ... nie wiem dlaczego) – hek2mgl

Odpowiedz

2

byłoby użyć awk do kolorowania (sed mogą być również stosowane)

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 

i przepuszczenie jej do column do wyrównania:

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

wyjściowa:

output

+0

Jak zachować odstępy wykonane przez 'kolumnę'? Z polecenia 'awk' wygląda na stałą liczbę spacji. –

+0

@EvanW Sprawdź aktualizację .. Pominięto, że – hek2mgl

+0

Jeśli rozumiem, to polecenie 'awk' wytworzy to samo wyjście co plik, który napisałem powyżej ... ale już próbowałem wysłać to do' kolumny' i nie jest wyrównane poprawnie z kodami ucieczki. –

2

Roztwór stosując printf formatować Ouput także:

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 dla użycia polecenia 'tput' :) .. Ale aligment nie jest jeszcze w porządku. Powinieneś podłączyć się do 'kolumny' – hek2mgl

+3

Nadal nie działa orurowanie do' kolumny' ...Wydaje mi się, że chodzi tu o "kolumnę", która potyka się o kody kolorów, a nie o samą kolorystykę. –

+0

POST odpowiednio edytowany. –

3

Napisałem wersję bash kolumny (podobną do tej z util-linux), który współpracuje z kodów kolorystycznych:

#!/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 

Przykład użycia Przykład

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 

wyjściowe:

enter image description here

+0

Próbowałem już kolumna 2 i działa! Niestety nie tak szybko jak kolumna. Oto czasy: kolumna 2 zrobiła 0.706s/0.599s/0.612s/0.622s, podczas gdy oryginalna kolumna osiągnęła 0.012s/0.009s/0.009s/0.010s. Ma to znaczenie, gdy użytkownik oczekuje na wyświetlenie informacji. Ale .... ponieważ kolumna nie będzie działać z kolorowymi kodami ucieczkowymi, będę nadal używać koloru 2 i +1 do autora. –

+0

Genialny! Czy mogę użyć tego w projekcie open source, nad którym pracuję? Właśnie wysłałem Ci maila z dodatkowymi informacjami :) – mfnalex