jon*_*rry 5 text-processing table
是否有一种简单的方法可以将逗号分隔的文本行拆分为某些列右对齐的列?
作为奖励,格式化数字会很好,但这对于 sed 来说可能并不太难。
awk和%42sprintf 格式浮现在脑海中。这是一个让您入门的简单脚本。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 }'
Run Code Online (Sandbox Code Playgroud)
如果您有数字字段,则可以使用其他printf 格式。
如果您有 BSD 实用程序column(Debian 提供它,我不知道其他 Linux 发行版),您可以轻松地使用column -t -s ,. 好处column是它会自动确定列宽。但是,它不进行右手格式;虽然您可以通过一些后处理获得它,但我不知道复杂性是否值得。
你可以用 Perl 做任何事。它的格式工具可能会有所帮助。
使用通用 unix 工具进行表格格式化的一种更强大的方法是tbl,它是处理表格的 *roff(手册页格式化程序)的一部分。但这也更复杂,因为您需要将输入转换为 roff。
另一种可能的工具是文本模式浏览器w3m,它擅长表格渲染。在这里,您必须将输入转换为 HTML。
最终自己弄清楚了这一点。而不是column,用于awk生成列。例如,如果 foo.txt 有“bar,36,17.34566”形式的行,你可以做类似的事情
cat foo.txt | awk -F, '{printf "%-20s %20d %20.2f\n", $1, $2, $3 }'
Run Code Online (Sandbox Code Playgroud)
生成宽度为 20 的列,第一列左对齐,其他两列右对齐,最后一列精度为两位小数。