将一行分成几列,其中一些列右对齐?

将一行分成几列,其中一些列右对齐?

有没有一种简单的方法可以将逗号分隔的文本行分割成列,并且某些列右对齐?

作为奖励,格式化数字会很好,但这对于 sed 来说可能并不难。

答案1

awk%42s我想到了 printf 格式。这是一个帮助您入门的简单脚本。在子句中设置width[i]为正值BEGIN会使该列具有给定的宽度,左对齐。如果width[i]为负数,则列i右对齐且宽度为-width[i]。该脚本不能智能地处理宽字段,所有后续列都只是在该行上向右移动。

awk -F, -vOFS= '
BEGIN {width[1]=-10; width[2]=8;}
{ for (i=1; i<=NF; i++) {$i = sprintf("%*s", width[i], $i)}
  print }'

如果您有数字字段,则可以使用其他字段printf 格式

如果您有 BSD 实用程序column(Debian 提供了它,我不知道其他 Linux 发行版),您可以轻松地使用column -t -s ,.好处是column它会自动确定列宽。然而,它不进行右手格式化;虽然你可以通过一些后处理来获得它,但我不知道这种复杂性是否值得。

你可以用 Perl 做一切事情。它是格式设施可能会有所帮助。

使用常见 UNIX 工具进行表格式化的更强大方法是tbl,它是 *roff(手册页格式化程序)处理表的部分。但这也更复杂,因为您需要将输入转换为 roff。

另一种可能的工具是文本模式浏览器w3m,擅长表格渲染。在这里,您必须将输入转换为 HTML。

答案2

最终我自己解决了这个问题。而不是column,使用awk来生成列。例如,如果 foo.txt 具有“bar,36,17.34566”形式的行,您可以执行类似的操作

cat foo.txt | awk -F, '{printf "%-20s %20d %20.2f\n", $1, $2, $3 }'

生成宽度为 20 的列,第一列左对齐,其他两列右对齐,最后一列具有两位小数精度。

答案3

我的管道:

| nl -nrz\
| rev\
| column -t\
| rev\
| cut -d' ' -f2-
  1. 添加固定宽度前缀列
  2. 字符串中的字符反转
  3. 列左对齐
  4. 字符串中的字符反转
  5. 删除 #1 中添加的列

相关内容