Como você trunca todas as colunas em um arquivo para um tamanho específico?

2

Dado o texto com colunas em um arquivo delimitado por um determinado caractere, como você trunca a largura de uma coluna específica ou de todas as colunas?

O caso de uso é que estou lendo alguns arquivos de log que possuem colunas delimitadas por espaço. Algumas das colunas no log são URLs muito longas que dificultam a leitura do arquivo. Eu realmente não me importo com todo o conteúdo dos URLs, então gostaria de truncar o tamanho dessas colunas para algo mais legível.

Eu estaria curioso para saber como especificar colunas específicas para truncar, mas na verdade eu só preciso descobrir como truncar todas as colunas de tamanho maior que N

.

Até agora eu encontrei os utils column , colrm e cut , que parecem ser similares a isso, mas nada que faça o que eu estou procurando.

(Idealmente, se houver um utilitário compilado que já faz isso, isso seria melhor, mas eu também ficaria feliz em encontrar uma maneira de fazer isso com sed , awk , perl , etc. )

    
por Cory Klein 12.09.2012 / 18:31

2 respostas

1

sed 's/\([^,]\{0,3\}\)[^,]*//g' truncará cada coluna para os 3 primeiros caracteres. Colunas são delimitadas pelo caractere ','.

Como funciona:

  1. Ele encontra (ganancioso) uma string com 0 a 3 caracteres diferente de ',' e lembra como primeiro grupo (referenciado por \ 1)

  2. Em seguida, ele tenta encontrar muito mais caracteres além de ',' como poderia.

  3. Tudo isso é substituído pelo grupo 1 (que são os primeiros 3 caracteres).

  4. Por causa da opção g , ele fará isso várias vezes em cada linha, truncando todas as colunas, não apenas a primeira.

EDITAR:

Como apontado no comentário, o primeiro passo pode ser otimizado se você usar ([^,]\{3\}\) . Desta forma, estamos apenas combinando exatamente 3 caracteres. Se houver menos, não nos importamos, já que não precisamos truncar esse campo. Então o comando final seria:

'sed 's/\([^,]\{3\}\)[^,]*//g''
    
por 12.09.2012 / 18:46
1

Eu poderia imaginar que não é essencial que o arquivo esteja estruturado em colunas desde que você escreveu que está incomodado com as URLs longas. Pelo menos no caso de analisar o arquivo em vez de visualizá-lo.

Neste caso, minha solução é

perl -pe 's%(http://\S+)%substr($1, 0, 15)%ge' <file_with_long_urls> | column -t

Isso remove todos os caracteres da URL por trás do décimo quinto caractere após um http:// .

Se as colunas não forem delimitadas por espaços em branco, mas com o caractere & (que significa um delimitador arbitrário), minha solução será

perl -pe 's%(http://\S+?)(?=&|$)%substr($1, 0, 15)%ge' <file_with_long_urls> | column -s '&' -t

Talvez você possa trabalhar com isso!

    
por 12.09.2012 / 19:59