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.