如何清除文本中未对齐的列?

veh*_*zzz 25 text

我有一个C程序输出两列,完全未对齐.不对齐的原因是第一列中的单词长度非常不同.

我在vi中打开了一个输出文件.如何快速对齐这两列?我使用awk,perl,sed,而不仅仅是vi(7.2)工具集.另外,我们可以为具有两列以上的文件提供通用解决方案吗?

这是示例文件

column1               column2
-------               -------
sdfsdfsddfsdfsdfsdfsd         343r5
dfgdfgdf             234
gdfgdfgdfgdfgf            645
Run Code Online (Sandbox Code Playgroud)

小智 36

对于快速和脏的修复,将其通过列管道:

your_program | column -t
Run Code Online (Sandbox Code Playgroud)

如果需要在列数据中包含空格,则使用某些字符(例如"|")分隔字段 和:

your_program | column -t -s "|"
Run Code Online (Sandbox Code Playgroud)

您可以将任何字符用于分隔符,并使用-s开关指定它.控制字符是可能的,但使用起来有点棘手.

但正如杰伊所说,你最好修复程序以正确格式化输出.


Jay*_*rod 31

据推测,您首先要使用printf输出列.您可以在格式字符串中使用额外的修饰符,以确保对齐.

  • 要打印特定宽度的列(右对齐),请在格式化标记之前添加宽度,例如,"%10s"将打印宽度为10的列.如果字符串长度超过10个字符,则列将更长比你想要的,所以选择一个最大值.如果字符串较短,则会用空格填充.
  • 要左对齐列,请在前面加上 - 符号,例如"%-10s".我个人喜欢左对齐字符串和右对齐数字.
  • 如果要打印地址,可以将填充字符从空格更改为零,并使用前导零:"%010x".

为了给出一个更深入的例子:

printf("%-30s %8s %8s\n", "Name", "Address", "Size");
for (i = 0; i < length; ++i) {
    printf("%-30s %08x %8d\n", names[i], addresses[i], sizes[i]);
Run Code Online (Sandbox Code Playgroud)

这将打印三列,如下所示:

Name                            Address     Size
foo                            01234567      346
bar                            9abcdef0     1024
something-with-a-longer-name   0000abcd     2048
Run Code Online (Sandbox Code Playgroud)


小智 9

这是一个awk解决方案: c_prog | awk '{ printf("%- 40s %- 40s\n", $1, $2); }'