Pesquisa de site

Diferentes maneiras de usar o comando de coluna no Linux


Você já esteve na situação de trabalhar com arquivos CSV e produzir resultados em formato tabular estruturado? Recentemente estive trabalhando com limpeza de dados em um arquivo que não está em uma estrutura adequada. Tem tantos espaços em branco entre cada coluna e tenho que convertê-lo para o formato CSV para enviar para o banco de dados. Após limpar e criar a saída no formato CSV, minha saída não é visualmente atraente para verificar a integridade dos dados no arquivo CSV. Este é o momento em que o comando “Coluna” é útil para mim.

De acordo com a página de manual, o comando columncolumnate lists ”. Em palavras simples, a coluna é um utilitário simples que pode formatar sua saída em um formato de coluna (linhas e campos) com base na estrutura do seu arquivo de origem. O comando column faz parte do pacote util-linux.

Um ponto importante a ser observado aqui é que o comando column se comporta de maneira diferente em distros baseadas em Debian e em distros baseadas em Rhel. A razão é que a distribuição baseada em Debian usa “coluna” de bsdmainutils em vez de util-linux. A versão original do comando column é mais recente que o pacote bsdmainutils. Dê uma olhada no relatório de bug para saber mais sobre isso.

dpkg -S $(which column)

Para fins de demonstração, estou usando o CentOS 7 e mostrarei diferentes opções entre o Ubuntu e o CentOS 7. Para verificar a versão da coluna execute o seguinte comando. Este comando também mostrará a versão do pacote util-linux.

column --version  # will not work in Debian/ubuntu

Você também pode verificar a versão do util-linux executando os comandos abaixo.

rpm -qa | grep -i util-linux   # Redhat,Centos,Fedora,Amazon Linux
dpkg -l | grep -i util-linux    # Ubuntu

Antes de usar o comando column, um bom lugar para começar será a página de manual e explorar suas opções.

man column

Listar o conteúdo do arquivo em formato tabular

O comando column pode criar uma tabela passando o nome do arquivo como argumento junto com o sinalizador -t. Estou usando /etc/passwd como arquivo de entrada.

column -t /etc/passwd

Olhando para a imagem acima, você pode pensar que não é isso que esperávamos e o resultado pode parecer estranho. Sim! Você está certo. Colunas consideram o espaço como o delimitador padrão ao criar uma tabela. Esse comportamento pode ser substituído passando um delimitador personalizado.

Delimitador personalizado

Os delimitadores personalizados oferecem uma ampla gama de opções para trabalhar. Para criar um delimitador personalizado, use o sinalizador -s seguido por um delimitador. Agora usaremos “: ” como delimitador para dividir o arquivo /etc/passwd.

column -s ":"  -t /etc/passwd

Veja a imagem acima onde a tabela está bem formatada e estruturada. Na versão 2.23 do util-linux a opção -s foi alterada para não ser gananciosa.

Agora execute o mesmo comando no Ubuntu e o resultado será ganancioso. Isso ocorre porque o comando column (bsdmainutils) no Ubuntu tratará múltiplas palavras adjacentes como uma única palavra.

column -s ":"  -t /etc/passwd

Para superar esse comportamento, use o sinalizador -n.

column -t -s ":" -n /etc/passwd             # Only on Debian/Ubuntu

Ignorar linhas brancas vazias na saída do arquivo

Quando você tem linhas em branco em seu arquivo de entrada, o comando da coluna por padrão as ignora. Veja meu arquivo de entrada que está no formato CSV e adicionei uma linha em branco entre cada linha. Agora vamos criar uma tabela como fizemos antes com este arquivo de entrada.

column -t -s ";" dummy.txt

Na imagem acima você pode ver que meu arquivo de entrada dummy.txt possui linhas vazias e quando tento criar uma tabela, as linhas vazias são ignoradas.

Nota: Este é o comportamento padrão para ambas as variantes “bsdmainutils/util-linux” do comando column. Mas column (bsdmainutils) tem a opção de substituir esse comportamento passando o sinalizador -e.

column -e -t -s "," dummy.txt        # Only on Debian/Ubuntu

Na imagem acima, você pode ver que a tabela está formatada corretamente e as linhas vazias não são ignoradas.

Separador de saída de arquivo

Por padrão, dois espaços em branco serão usados como separadores de saída. Este comportamento pode ser substituído passando o sinalizador -o. Você não terá uma opção de separador de saída disponível na coluna (bsdmainutils).

column -t -s "," -o "||" dummy.txt	# Only on Rhel based distro

Converter linhas de arquivo em colunas

Usando o sinalizador -x você pode converter linhas em colunas. Este comportamento é o mesmo nas variantes rhel e ubuntu do comando de coluna. Este é um recurso muito útil quando você precisa capturar um determinado campo por meio do comando awk ou column e convertê-lo no cabeçalho do seu arquivo CSV.

column -x fillcols.txt

Quando você executa o comando column sem usar nenhum sinalizador, o comportamento será o mesmo de passar o sinalizador -x.

Encontre o tamanho da coluna

A coluna usa uma variável de ambiente ($COLUMNS) para descobrir o tamanho do seu terminal e com base no tamanho use o comando echo, o tamanho da tabela será exibido no terminal .

echo $COLUMNS

Dê uma olhada na imagem abaixo. Inicialmente, redimensionei meu terminal para ter $COLUMNS o tamanho definido como 60 e executei o comando da coluna. Novamente redimensionei meu terminal para ter $COLUMNS o tamanho definido como 114 e executei o comando da coluna novamente. Você pode ver a diferença em como a coluna imprime a tabela quando redimensionamos o terminal.

column -t -s ":" /etc/passwd | head 5

É isso neste artigo. Se você tiver algum comentário, forneça-o na seção de comentários.