有没有一种简单的方法可以将逗号分隔的文本行分割成列,并且某些列右对齐?
作为奖励,格式化数字会很好,但这对于 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 中添加的列