![使“column”在输出中使用单个空格作为列分隔符](https://linux22.com/image/46485/%E4%BD%BF%E2%80%9Ccolumn%E2%80%9D%E5%9C%A8%E8%BE%93%E5%87%BA%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%8D%95%E4%B8%AA%E7%A9%BA%E6%A0%BC%E4%BD%9C%E4%B8%BA%E5%88%97%E5%88%86%E9%9A%94%E7%AC%A6.png)
$ 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_crissti
column: invalid option -- 'o'
或许don_crissti 的评论例子被切断了...
默认输出分隔符是两个空格,因此您可以运行:
echo 'a b' | column -t -o ' '
这有效:
echo 'a b' | column -t -o " "
例如2:
column -t -o " " < data