【问题标题】:Replace tab with variable amount of spaces, maintaining the alignment用可变数量的空格替换制表符,保持对齐
【发布时间】:2021-02-04 16:47:52
【问题描述】:

我有一个制表符分隔的文件,由 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

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

有没有 linux 工具可以帮我做,还是我自己写?

【问题讨论】:

  • 试试:column -t file
  • 这正是我所需要的,只需提供-s ' ' 即可获得完全相同的视觉输出。谢谢!
  • column 无法产生预期的输出,因为它只是在所有列之间添加固定数量的空白,其中每个列的宽度由该列中最长的非空白链决定。所以它会在输入的最后一行GHIJ 的结尾和2 的开头之间添加 2 个空格(或您指定的任何数字),但它也会在 3 之间使用 2 个空格而不是 7 个空格和0 在同一行。它是一个很好的工具,可以创建可视化的表格输出,但不能保留制表符分隔输入的间距。

标签: bash awk tabs whitespace


【解决方案1】:

称为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$

【讨论】:

    【解决方案2】:

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

    $ expand file
    

    将完全按照您的意愿行事。对应的unexpand -a 做相反的事情。两者中几乎没有其他有用的选项。

    【讨论】:

      【解决方案3】:

      使用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.
      

      【讨论】:

      • 这不会产生预期的输出。请参阅问题下方的my comment
      猜你喜欢
      • 2020-09-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      相关资源
      最近更新 更多