将(短)每行数据重新格式化为表格布局以填充我的终端

问题描述 投票:0回答:2

我有一个文本文件,每行包含一小段数据:可能是一个单词,也可能是一个数字。为简单起见,我们假设该文件中没有空行,也没有标题。例如,假设我的输入是:

hobby
anger
experienced
profession
golf
director
code
telephone

现在,我希望将该输入以表格形式、行优先、保留顺序排列在我的终端上。假设我的终端有 40 个字符宽;这将是:

hobby      anger     experienced
profession golf      director
code       telephone

如果有一种简洁的方式来实现这一点,而不需要很长的 shell 脚本就已经很好了。除此之外,我还想要索引,如下所示:

   0          1         2
0  hobby      anger     experienced
3  profession golf      director
6  code       telephone

这对于

nl --line-increment
来说是可行的,但问题是,在知道最大索引是多少之前,我需要知道列数,并且我需要最大索引才能知道索引列宽度是多少,并且我需要知道索引列的宽度来决定一行可以容纳多少列,所以我们有一点恶性循环。


到目前为止我所拥有的:

如果我放弃任何对齐方式以及每行列数的自动最大化,我可以使用:

per_line=3;  pr -a -${per_line} -t -s\  | nl -v 0 --line-increment ${per_line}

获得:

     0  hobby anger experienced
     3  profession golf director
     6  code telephone
bash command-line text-formatting
2个回答
0
投票

如果您愿意放弃自动计算出最佳列数,您可以设置

${num_cols}
,然后使用:

pr -a -${num_cols} -t -s, -  | \
nl -v 0 --line-increment ${num_cols} | \
column -s, -t

根据您的输入,这给出:

     0  hobby       anger      experienced
     3  profession  golf       director
     6  code        telephone

这或多或少是你想要的。


0
投票

这看起来不错。文件

input
包含您发布的代码内容。

首先我生成数字 0 1 2 和由

,
分隔的 3 列的文件内容。

然后对于从第二行开始的行,行进行编号。

之后,漂亮的专栏就创建好了。

$ ( seq 3; cat input; ) | paste -d, - - - | ( read;echo ",$REPLY"; nl -v 0 -i 3 -s, ) | column -t -s,
        1           2          3
     0  hobby       anger      experienced
     3  profession  golf       director
     6  code        telephone
© www.soinside.com 2019 - 2024. All rights reserved.