使“column”在输出中使用单个空格作为列分隔符

使“column”在输出中使用单个空格作为列分隔符
$ echo 'a b' | column -t 
a  b

输出中a和之间有 2 个空格。b如何column在可能的情况下仅使用一个空间进行分隔?

编辑 2:更改数据以包含更多案例

$ 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

预期的

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

注意:请不要提供sed适用于此特定情况的技巧。关于 SE 的问题应该对其他人有用,而不仅限于高度特定的数据格式。

答案1

你可以修剪仅最后一个空格字符任何一系列空格字符;像这样:

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

由于您总是连续至少有两个空格字符,因此这始终可以按照您的意愿修剪分割:

输入:

column -t -s\ <<\COLS | sed 's/\( *\) /\1/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

输出:

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

为了真正演示如何sed遵守该规则,我们可以将列的几个副本首尾相连,每个副本获得一个空间偏移量......

输入:

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

输出:

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

答案2

试试这个方法:

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

来自专栏手册页:

  • -t确定输入包含的列数并创建一个表。默认情况下,列以空格或使用 -s 选项提供的字符分隔。对于漂亮的打印显示很有用。
  • -s指定用于分隔 -t 选项的列的一组字符。

版本完成后,此命令应该可以工作:

$ 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

上次更新的命令(对不起,伙计,但它是一个sed命令,看不到仅使用 执行的方式column):

$ cat data | column -t | sed -r 's: ( [a-z,0-9]):\1: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

答案3

寻址用户80551的评论在这个问题下:

@don_crissticolumn: invalid option -- 'o'

或许don_crissti 的评论例子被切断了...

默认输出分隔符是两个空格,因此您可以运行:

echo 'a b' | column -t -o ' '

这有效:

echo 'a b' | column -t -o " "

例如2:

column -t -o " " < data

相关内容