Make 'column' usa um único espaço como separadores de coluna na saída

4
$ echo 'a b' | column -t 
a  b

Existem dois espaços entre a e b na saída. Como posso fazer com que column use apenas um espaço para separação, quando possível?

EDIT 2: Dados alterados para incluir mais casos

$ cat data 
1 2 b
20 12.5 something
300 12.8 as
600 16 asrgty
1200 4.9 srty
1800 33.5 sry
10000 1.5 sty
200000 1.5 sty
$ column -t < data
1       2     b
20      12.5  something
300     12.8  as
600     16    asrgty
1200    4.9   srty
1800    33.5  sry
10000   1.5   sty
200000  1.5   sty
$  column -t -s '' < data
1 2 b
20 12.5 something
300 12.8 as
600 16 asrgty
1200 4.9 srty
1800 33.5 sry
10000 1.5 sty
200000 1.5 sty
$ column -t -s ' ' < data
1       2     b
20      12.5  something
300     12.8  as
600     16    asrgty
1200    4.9   srty
1800    33.5  sry
10000   1.5   sty
200000  1.5   sty
$ column -t < data | sed -re 's/  / /g'
1    2   b
20   12.5 something
300   12.8 as
600   16  asrgty
1200  4.9  srty
1800  33.5 sry
10000  1.5  sty
200000 1.5  sty
$ column -t < data | sed -re 's/  / /'
1      2     b
20     12.5  something
300    12.8  as
600    16    asrgty
1200   4.9   srty
1800   33.5  sry
10000  1.5   sty
200000 1.5   sty

Esperado

1      2    b
20     12.5 something
300    12.8 as
600    16   asrgty
1200   4.9  srty
1800   33.5 sry
10000  1.5  sty
200000 1.5  sty

Nota: Por favor, não dê sed hacks que funcionem para este caso específico. As perguntas sobre SE devem ser úteis para outras pessoas e não se limitam a formatos de dados altamente específicos.

    
por user80551 15.01.2015 / 19:20

2 respostas

3

Você pode cortar somente o último caractere de espaço em qualquer série de caracteres de espaço; assim:

sed 's/\( *\) //g'

E como você sempre tem pelo menos dois caracteres espaciais seguidos, isso sempre funcionará para aparar as divisões da maneira que você deseja:

ENTRADA:

column -t -s\ <<\COLS | sed 's/\( *\) //g'
0 3.1415926535 s
00 3.141592653 so
000 3.14159265 som
0000 3.1415926 some
00000 3.141592 somet
000000 3.14159 someth
0000000 3.1415 somethi
00000000 3.141 somethin
000000000 3.14 something
COLS

OUTPUT:

0         3.1415926535 s
00        3.141592653  so
000       3.14159265   som
0000      3.1415926    some
00000     3.141592     somet
000000    3.14159      someth
0000000   3.1415       somethi
00000000  3.141        somethin
000000000 3.14         something

Para realmente demonstrar como sed honrará a regra, podemos anexar algumas cópias de nossas colunas de um lado para o outro com cada ganho adicional de um único deslocamento de espaço ...

ENTRADA:

column -t <input | sed 's/.*/&  &   &/;s/\( *\) //g'

OUTPUT:

0         3.1415926535 s 0         3.1415926535 s  0         3.1415926535 s
00        3.141592653  so 00        3.141592653  so  00        3.141592653  so
000       3.14159265   som 000       3.14159265   som  000       3.14159265   som
0000      3.1415926    some 0000      3.1415926    some  0000      3.1415926    some
00000     3.141592     somet 00000     3.141592     somet  00000     3.141592     somet
000000    3.14159      someth 000000    3.14159      someth  000000    3.14159      someth
0000000   3.1415       somethi 0000000   3.1415       somethi  0000000   3.1415       somethi
00000000  3.141        somethin 00000000  3.141        somethin  00000000  3.141        somethin
000000000 3.14         something 000000000 3.14         something  000000000 3.14         something
    
por 15.01.2015 / 19:42
1

Tente desta maneira:

$ echo 'a b' | column -t -s ''
a b

Da página de coluna:

  • -t Determina o número de colunas que a entrada contém e cria uma tabela. As colunas são delimitadas com espaço em branco, por padrão, ou com os caracteres fornecidos usando a opção -s. Útil para displays de impressão bonita.
  • -s Especifique um conjunto de caracteres a ser usado para delimitar colunas para a opção -t.

Após sua edição, este comando deve funcionar:

$ cat data | column -t | sed -r 's:  : :'
300  12.8
600  16.9
900  19.2
1200 24.9
1500 29.7
1800 33.5

Um comando para a última atualização (desculpe mate, mas é um comando sed , não é possível ver a maneira de fazer apenas com column ):

$ cat data | column -t | sed -r 's: ( [a-z,0-9])::g'
1      2    b
20     12.5 something
300    12.8 as
600    16   asrgty
1200   4.9  srty
1800   33.5 sry
10000  1.5  sty
200000 1.5  sty
    
por 15.01.2015 / 19:32