Como posso usar a coluna para delimitar guias e não espaços?


59

Eu gostaria de usar o columncomando Unix para formatar algum texto. Eu tenho campos delimitados por tabulações, mas dentro de cada campo também há espaços. columndelimita em espaço em branco (tabulações e espaços). Como posso fazer com que a coluna use apenas guias como delimitador?

Eu estava tentando especificar a guia como delimitador usando:

cat myfile | column -t -s"\t"

Respostas:


82
column -t -s '\t'

separaria colunas \e tcaracteres.

column -s \té o mesmo que column -s t, como a barra invertida é interpretada como um operador de cotação pelo shell.

Aqui você deseja passar um caractere TAB real para a coluna. Com ksh93, zsh, bash, mksh, busybox sh ou FreeBSD sh:

column -ts $'\t'

Ou insira um caractere de tabulação real digitando Ctrl-V Tabno prompt do shell (entre aspas ou precedido por uma barra invertida, pois o caractere de tabulação é um separador de token na sintaxe do shell, assim como o espaço), ou use "$(printf '\t')"(essas aspas duplas necessárias para desativar a divisão + glob operador como o caractere de tabulação também está no valor padrão de $IFS).


3
Eu tive que fazer column -t -s $'\t'como bash parecia pensar '\t'ambos \ e t, mas $'\t'significa uma guia literal. Bash fede
— ThorSummoner

Se você precisar de conformidade com POSIX (Senhor, me ajude), consulte minha resposta, que é fortemente baseada nessa resposta fantástica!
— Nick Touro

Essa solução funcionou para mim - a $'\t'guia makes, o delimitador. Mas tenho certeza de que faço awk -F "\t"para usar uma guia como delimitador do awk. Por que isso funciona e não aqui para coluna?
— Mike

3

Usei o seguinte (só funciona se o seu texto não contiver |):

cat myfile | tr '\t' '|' | column -t -s '|'

Isso apenas substitui as guias por pipes e usa a coluna com pipes como delimitadores.

(Fiz isso porque não vi nada na resposta de Stéphane que funcionasse imediatamente na casca do peixe. Caso contrário, a resposta de Stéphane parece boa.)


3

Para POSIX, $'...'conhecido como escape ANSI-C, não está definido.

Em vez disso, você pode usar $(printf '\t'):

column -t -s "$(printf '\t')"

$(printf '\011')pode ser usado, pois 011(representação octal do decimal 9) é o código ANSI para um caractere de tabulação horizontal:

column -t -s "$(printf '\011')"

No entanto, veja os comentários abaixo de Stéphane Chazelas sobre o motivo de isso não ser consistente nas versões do shell.


2
Observe que o POSIX não especifica qual é a codificação do TAB. Ainda existem sistemas POSIX cuja codificação da localidade C é baseada em EBCDIC, em que TAB é 5, não 9 como em ASCII. Sempre que possível, é melhor consultar os caracteres pelo nome para evitar esse tipo de problema, como "$(printf '\t')"mostrado na minha resposta. Observe que $'...'está planejado para inclusão na próxima versão principal da especificação POSIX.
— Stéphane Chazelas

@ StéphaneChazelas é $(printf '\t')POSIX? Obrigado!
— Nick Touro


@ StéphaneChazelas Muito obrigado, eu atualizei a minha resposta para incluir sua dica muito útil :)
— Nick Touro

2

O -té para selecionar o número de colunas que você deseja. Deixar este espaço em branco não muda nada. Além disso, você deseja um espaço em branco após o teste, -sentão tente isso:

cat myfile | column -s \t


Obrigado. Isso é próximo ao que estou procurando. No entanto, agora todas as linhas são mescladas em uma linha. Como posso manter cada linha em sua própria linha?
— tartaruga

Por padrão, columnpreenche linhas antes das colunas. Você pode estar interessado empr
— lurker
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.