Criando colunas a partir da saída de texto, mas com várias colunas de palavras

0

Eu tenho a seguinte saída:

Person 49 
Persons Boss 3
HR 21 
CEO 93
System Administrator 2

Usar column -t produz a seguinte saída:

Person   49
Persons  Boss           3
HR       21
CEO      93
System   Administrator  2

como você pode ver, isso não parece bom. Eu preciso que a saída seja assim:

Person               49
Persons Boss          3 
HR                   21
CEO                  93
System Administrator  2

Alguém sabe como isso pode ser produzido?

    
por Matt 16.04.2015 / 12:27

3 respostas

0

Você pode fazer isso com um one-liner salvando o último arquivo em uma nova variável, e então definir o ponteiro original como uma string vazia, e depois imprimir $ 0 e a variável do último arquivo que você salvou.

(echo a b c 10; echo x y 2 ; echo x 1) \
       | awk '{lastf=$NF ; $NF="" ; print $0,", "lastf}' \
       | column -ts,

# output
a b c     10
x y       2
x         1
    
por 16.04.2015 / 13:56
2

Altere o separador da coluna para, e. Tab que usar column :

output | sed 's/\S\+\s*$/\t&/' | column -t -s $'\t'
    
por 16.04.2015 / 12:37
2

Aqui está uma solução no awk que determina dinamicamente as larguras de coluna necessárias. Ele pode pegar qualquer número de campos em cada linha, mas assume que o campo final é um inteiro. Os inteiros são formatados para se alinharem à direita, conforme desejado.

format.awk

#!/usr/bin/awk -f

# Format text and numbers into two columns
# Written by PM 2Ring 2015.04.16

#Gather data, line by line
{
    #Split name from number
    match($0, /^(.*) ([0-9]+)[[:space:]]*$/, a)
    #printf "%d: %s -> [%s] [%s]\n", NR, $0, a[1], a[2]

    #Store name & number into arrays
    name[NR] = a[1]
    num[NR] = a[2]

    #Update field widths
    namelen = length(a[1])
    if (namelen > maxname) 
        maxname = namelen

    numlen = length(a[2])
    if (numlen > maxnum) 
        maxnum = numlen
}

#Print re-formatted data
END{
    for(i=1; i<=NR; i++)
        #Use printf's '*' modifier to specify field widths 
        printf "%-*s %*d\n", maxname, name[i], maxnum, num[i]
}

saída

Person               49
Persons Boss          3
HR                   21
CEO                  93
System Administrator  2

Você pode chamar o script assim:

$ awk -f format.awk data_filename

Você também pode enviar os dados de texto para ele. E se você usar chmod para conceder permissões de execução, você poderá executá-las como qualquer outro comando.

Obviamente, isso é um pouco mais elaborado do que a solução de Costa que usa sed para pré-processar a entrada para column . Então sugiro usar isso, a menos que você realmente queira que os números sejam justificados à direita. :) OTOH, embora este script pareça maior que o one-liner de Costa, awk é muito rápido, então espero que essa solução seja comparável em velocidade à de Costa, mesmo com arquivos de dados realmente grandes.

    
por 16.04.2015 / 13:26

Tags