为什么 column 命令不能正确对齐列?

Cea*_*sta 6 printing

在另一个问题中,我询问了如何在使用 ls 时隐藏所有 .pyc 文件,Ignacio 提出以下建议: ls |  grep -v '.pyc$' |  柱子

正如我上面提到的,这并不准确,因为输出偶尔会错位:

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
Run Code Online (Sandbox Code Playgroud)

虽然我得到了满意的答案,但我很好奇:为什么 column 会这样做(并且可以修复它以正确打印)?

Pet*_*r.O 10

在没有任何选项的情况下调用时,column使每个分隔的字符串与最近的TAB-STOP COLUMN对齐。在终端中,这通常位于每 8 个字符的列上。看看这个例子:

创建一个文件(ztxt)含有一些标签-字符 \t分隔的字符串,分布在3条线,其一端与换行字符\n

aaa1\taaaaaaaaaaaaaa2\taaaaaaaaaaaaaaaaaaa3\taaa4
bbbbbbb1\tbbb2\tbbb3
ccc1\tccc2
Run Code Online (Sandbox Code Playgroud)

输出:column ztxt- 与最近的TAB-STOP完美对齐

aaa1    aaaaaaaaaaaaaa2 aaaaaaaaaaaaaaaaaaa3    aaa4
bbbbbb1 bbb2    bbb3
ccc1    ccc2
|       |       |       |       |       |       |
|-------|-------|-------|-------|-------|-------|
Run Code Online (Sandbox Code Playgroud)

要将每个连续字段的 LSH 与其上方的对齐,您需要使用该-t选项,例如。column -t ztxt

aaa1     aaaaaaaaaaaaaa2  aaaaaaaaaaaaaaaaaaa3  aaa4
bbbbbb1  bbb2             bbb3
ccc1     ccc2
Run Code Online (Sandbox Code Playgroud)

如果您的所有数据都在一个没有任何换行符的长流中,您可以使用过滤器引入它们;例如每4 个字段一个。 sed可以用这个命令来做。

sed -re 's/(([^\t]*\t){3}[^\t]*)\t/\1\n/g' 
Run Code Online (Sandbox Code Playgroud)

默认情况下,该column命令会将多个相邻的分隔符合并为一个分隔符。为了在sed过滤器中满足这一点,它还需要:

sed -re 's/\t+/\t/g;' 
Run Code Online (Sandbox Code Playgroud)

因此,拆分连续的制表符分隔字符串流的命令,因为每 4 个字符串是:

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

这种连续输入流的输出是(使用原始样本输入,但通过用制表符替换原始换行符进行修改——它仍然必须保留其尾随 \n):

aaa1      aaaaaaaaaaaaaa2  aaaaaaaaaaaaaaaaaaa3  aaa4
bbbbbbb1  bbb2             bbb3                  ccc1
ccc2
Run Code Online (Sandbox Code Playgroud)


ktf*_*ktf 0

如果ls输出出现乱码,则表明一个或多个文件名中存在不可打印的字符。因此,我建议始终使用该-q选项ls

任何不可打印的字符都将作为问号打印出来。

所以请尝试:

 ls -Cq
Run Code Online (Sandbox Code Playgroud)