用可变数量的空格替换制表符,保持对齐

Replace tab with variable amount of spaces, maintaining the alignment

我有一个制表符分隔的文件,由 7 列组成。

ABC     1437    1       0       71      15.7    174.4
DEF     0       0       0       1       45.9    45.9
GHIJ    2       3       0       9       1.1     1.6

我需要用可变数量的 space 字符替换制表符,以便保持列对齐。请注意,我 希望每个选项卡都被 8 space 替换。相反,我想要在第 1 行第 1 列(8 - 长度(ABC)= 5)之后 5 spaces,在第 1 行第 2 列(8 - 长度(1437))之后 4 spaces = 4), 等等

是否有 linux 工具可以帮我做,或者我应该自己写?

被称为 pr -e -t 的 POSIX 实用程序 pr 完全可以满足您的需求,并且 AFAIK 存在于每个 Unix 安装中。

$ cat file
ABC     1437    1       0       71      15.7    174.4
DEF     0       0       0       1       45.9    45.9
GHIJ    2       3       0       9       1.1     1.6

$ pr -e -t file
ABC     1437    1       0       71      15.7    174.4
DEF     0       0       0       1       45.9    45.9
GHIJ    2       3       0       9       1.1     1.6

并且选项卡显示为 ^Is:

$ cat -ET file
ABC^I1437^I1^I0^I71^I15.7^I174.4$
DEF^I0^I0^I0^I1^I45.9^I45.9$
GHIJ^I2^I3^I0^I9^I1.1^I1.6$

$ pr -e -t file | cat -ET
ABC     1437    1       0       71      15.7    174.4$
DEF     0       0       0       1       45.9    45.9$
GHIJ    2       3       0       9       1.1     1.6$

有专用于此任务的命令对。

$ expand file

会做你想做的。对方unexpand -a做相反的事情。两者都没有其他有用的选项。

使用 column,正如 anubhava 在评论中所建议的那样,特别是使用 -t-s 选项:

column -t -s $'\t' in_file

来自column manual

   -s, --separator separators
          Specify the possible input item delimiters (default is
          whitespace).

   -t, --table
          Determine the number of columns the input contains and
          create a table.  Columns are delimited with whitespace, by
          default, or with the characters supplied using the
          --output-separator option.  Table output is useful for
          pretty-printing.