我想从文件中提取数据并将其组织在一个固定宽度的大表中。我可以预期这个表会有多列,比如说 30 列。如果我使用传统awk
命令行创建此表,那么我将需要编写一个很长的awk
命令行,类似于以下内容:
awk '{printf "%-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s\n", $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30}'
反正有没有使这个线性更短?例如,我正在考虑在前面的长命令中实现一个数组。该数组将告诉awk
我要创建的列的数量和宽度,而不是单独定义每一列,例如:
awk 'BEGIN {for i in {1..30}; do echo %-5s\n print i}
如何在内部正确实现awk
以创建多个固定宽度的列?
您可以在循环内一次打印一个字段。
请注意,循环后需要打印换行符,以防止多行合并为一条。
例如
您可以(但我不建议这样做)逐步构建一些变量(bash 中的示例):
但您也可以在 awk 中完成所有操作:
split
in将awk
使用与FS
用于将行拆分为字段并将每个值放入数组中相同的正则表达式a
。for
自动)循环遍历所有字段。printf
将打印具有相同格式的所有字段。print
将在行尾放置一个换行符。这更灵活,因为它适用于任意数量的字段,甚至是具有不同数量字段的行。并且仅在一种语言内完成(更易于理解和维护)。
甚至:
您可以将格式更改为
%-5.5s
以剪切长度超过 5 个字符的字段。请注意,awk 的 printf 错误地将分解的字符计算
é
为两个字符。它似乎计算 Unicode 代码点(一个常见问题)而不是 Unicode 集群。编辑 从评论中回答这个额外的问题:
只需添加所需的代码: