Por que o comando da coluna não alinha as colunas corretamente?

6

Em outra pergunta, perguntei em como esconder todos os arquivos .pyc ao usar ls , Ignacio sugeriu o seguinte:

Isso, como mencionei acima, não funciona com precisão, pois a saída é ocasionalmente desalinhada:

ceasarbautista@hse140:~/Desktop/Statistics/statistics/markov$ ls
README          __init__.pyc        markov.py       matrix2graph.pyc    pathfinder.pyc      priority_dict.pyc   spanning.py
__init__.py     graph.py        matrix2graph.py     pathfinder.py       priority_dict.py    space.py        vector.py
ceasarbautista@hse140:~/Desktop/Statistics/statistics/markov$ ls | grep -v '\.pyc$' | column
README      graph.py        matrix2graph.py priority_dict.py    spanning.py
__init__.py markov.py   pathfinder.py   space.py        vector.py

Enquanto recebi uma resposta satisfatória, estou curioso: por que a coluna faz isso (e pode ser corrigida para imprimir corretamente)?

    
por Ceasar Bautista 24.10.2011 / 04:26

5 respostas

9

Quando chamado sem nenhuma opção, column faz com que cada string delimitada seja alinhada com a COLUNA TAB-STOP mais próxima. Em um terminal, isso é normalmente em todas as colunas do oitavo caractere. Dê uma olhada neste exemplo:

Crie um arquivo ( ztxt ) contendo algumas cadeias guia - caractere \t , distribuídas em três linhas que terminam com caractere de nova linha \n :

aaa1\taaaaaaaaaaaaaa2\taaaaaaaaaaaaaaaaaaa3\taaa4
bbbbbbb1\tbbb2\tbbb3
ccc1\tccc2

Saída de: column ztxt - perfeitamente alinhado ao TAB-STOP

mais próximo
aaa1    aaaaaaaaaaaaaa2 aaaaaaaaaaaaaaaaaaa3    aaa4
bbbbbb1 bbb2    bbb3
ccc1    ccc2
|       |       |       |       |       |       |
|-------|-------|-------|-------|-------|-------|

Para alinhar o LSH de cada campo sucessivo ao campo acima, você precisa usar a opção -t , por exemplo. column -t ztxt

aaa1     aaaaaaaaaaaaaa2  aaaaaaaaaaaaaaaaaaa3  aaa4
bbbbbb1  bbb2             bbb3
ccc1     ccc2

Se todos os seus dados estiverem em um fluxo longo sem quebras de novas linhas, você poderá usar um filtro para apresentá-los; por exemplo, um em cada 4 campos. sed pode fazer isso com este comando.

sed -re 's/(([^\t]*\t){3}[^\t]*)\t/\n/g' 

Por padrão, o comando column mesclará vários delimitadores adjacentes em um único delimitador. Para atender a isso no filtro sed , também é necessário:

sed -re 's/\t+/\t/g;' 

Assim, o comando para dividir um fluxo contínuo de strings delimitadas por tabulação , como toda quarta string é:

<ztxt sed -re 's/\t+/\t/g;s/(([^\t]*\t){3}[^\t]*)\t/\n/g' | column -t  

A saída desse fluxo de entrada contionuous é (usando a entrada de amostra original, mas modificada pela substituição das novas linhas originais por caracteres de tabulação - ele ainda deve manter seu rastreio \ n):

aaa1      aaaaaaaaaaaaaa2  aaaaaaaaaaaaaaaaaaa3  aaa4
bbbbbbb1  bbb2             bbb3                  ccc1
ccc2
    
por 24.10.2011 / 15:29
0

Se ls da saída estiver distorcida, isso indica que há caracteres não imprimíveis dentro de um ou mais nomes de arquivos. Portanto, recomendo sempre usar a opção -q com ls .

Qualquer caractere não imprimível será então impresso como um ponto de interrogação.

Então, por favor, tente:

 ls -Cq
    
por 24.10.2011 / 10:35
0

O problema com a coluna é que ela é dividida em \ s +, não vejo como dividi-la em uma única guia. Eu escrevi este script muito mais flexível para resolver este problema, que qualquer um é livre para usar:

link

Aqui está o uso completo:

  --------------------------------------------------------------------------
 | This script displays tab delimited text in properly aligned columns.     |
 |                                                                          |
 | Usage: perl display.pl  [num lines] [options]                      |
 |                                                                          |
 | Where  is tab delimited.                                           |
 |                                                                          |
 | If  is followed by a positive integer N, only the first N lines    |
 | will be returned.                                                        |
 |                                                                          |
 | If lines are long, this script works bests if piped to "less -S".        |
 |                                                                          |
 | [options]                                                                |
 |                                                                          |
 | -noheader :  A header line is assumed by default.                        |
 |                                                                          |
 | -nodots   :  By default if a column is wide and an entry in that column  |
 |              is short, dots are put after it to help line things up.     |
 |              Use this option to just print spaces, no dots.              |
 |                                                                          |
 | -dotcols  :  Use this to specify specific columns to have dots     |
 |                    (see the -nodots option).   must be a comma     |
 |                    separated list of positive integers w/o whitespace.   |
 |                                                                          |
 | -cols  :  Use this to specify a subset of columns to output.       |
 |                  is a comma separated list of positive integers    |
 |                 and/or spans of positive integers.  Examples of valid    |
 |                 lists are: 4,6,12 or 4-10 or 1-4,12,15,4-7.  Columns     |
 |                 can be repeated and don't have to be in numerical order. |
 |                                                                          |
 | NOTE: This script was hacked from a much more complicated script, so     |
 | the code is full of all kinds of irrelevant stuff.                       |
  --------------------------------------------------------------------------
    
por 18.03.2013 / 15:23
0

Para mostrar caracteres não imprimíveis (como códigos de escape C sempre que possível) na sua saída ls você também pode usar a opção -b para o comando ls :

ls -Cb | grep -v '\.pyc$' | column -t
    
por 18.03.2013 / 16:10
0

Para o bit de múltiplos delimitadores. Irritantemente, a opção -n está disponível apenas no Debian, que lidou com vários delimitadores.

column -t -n <file>
    
por 27.09.2013 / 13:25

Tags