gpt4 book ai didi

bash - awk - 以 3 列格式打印输出

转载 作者:行者123 更新时间:2023-12-02 17:25:33 24 4
gpt4 key购买 nike

我有一个以下列格式显示的数据文本文件。

apropos c
awk nc
chsh c
date nc
grep nc
i3 nc
ip6tables nc

我正在尝试通过 awk 过滤此数据,以生成类似于下面的 3 列格式。

apropos          awk          chsh
date grep i3

我不需要文件的第二列信息,但想要第一列的干净且对齐的输出。我在别处找到了下面的代码,稍微修改了一下,只输出第一列数据。问题是由于使用了制表符,它出现错位。

awk '{printf (NR %3 == 0 )? $1 "\n" : $1"\t\t" }'

做更多的研究后,我通过 awk 的 printf(即“%-10s”)发现了宽度的用法。唯一的问题是我不太确定如何将它集成到我的命令中以使其执行我想要的操作。任何帮助将不胜感激,谢谢!

最佳答案

这可能比硬编码一些任意字段宽度(如 10)更有用:

$ awk '{ORS=(NR%3?FS:RS); print $1}' file | column -t
apropos awk chsh
date grep i3
ip6tables

或者如果您确实想从输出中删除 ip6tables,如示例输入/输出所示:

$ awk '{rec = rec OFS $1} !(NR%3){print rec; rec=""}' file | column -t
apropos awk chsh
date grep i3

如果您不通过管道传输到 column 并且不想选择一些任意数字作为字段宽度,那么您需要 awk 对输入文件进行 2 次传递以计算出最大宽度在打印之前首先对每一列进行排序(请参阅 https://stackoverflow.com/a/38791539/1745001)。

第一个示例 - 在不以换行符结尾的输入上运行任何 UNIX 工具依赖于 POSIX 规范的未定义行为,因此如果您的 column 在后面缺少换行符时发出警告ip6tables 然后添加:

$ awk '{ORS=(NR%3?FS:RS); print $1} END{if (NR%3) printf "%s", RS}' file | column -t
apropos awk chsh
date grep i3
ip6tables

关于bash - awk - 以 3 列格式打印输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38877075/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com