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

Bash awk-以3列格式打印输出,bash,awk,Bash,Awk,我有一个数据文本文件,它以以下格式显示 apropos c awk nc chsh c date nc grep nc i3 nc ip6tables nc 我试图通过awk过滤这些数据,以生成一个3列格式,如下所示 apropos awk chsh date grep i3 我不需要该文件的第二列信息,但希望第一列的输出干净且对齐。我在别处找到了以下代码,并对其进行了一些修改,使其仅输出第一列数据。问题是,由于使用

我有一个数据文本文件,它以以下格式显示

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 ie.%-10s使用宽度。唯一的问题是我不太确定如何将它集成到我的命令中,以使它执行我想要的操作。任何帮助都将不胜感激,谢谢

您可以使用以下awk |柱管道:

注意:由于至少BSD版本的column命令将打印警告:

column: line too long
如果列表中的行数不是列计数的倍数,则省略最后一行。在这种情况下,您需要在最后一个元素后打印换行符。

您可以使用以下awk |列管道:

注意:由于至少BSD版本的column命令将打印警告:

column: line too long

如果列表中的行数不是列计数的倍数,则省略最后一行。在这种情况下,您需要在最后一个元素后打印换行符。

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

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

$ awk '{rec = rec OFS $1} !(NR%3){print rec; rec=""}' file | column -t
apropos  awk   chsh
date     grep  i3
如果不使用管道连接到列,也不希望选择任意数字作为字段宽度,则需要awk对输入文件进行两次遍历,以在打印前首先计算出每列的最大宽度,请参见

wrt第一个示例-在不以换行符结尾的输入上运行任何UNIX工具都依赖于POSIX规范中未定义的行为,因此如果您的列在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

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

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

$ awk '{rec = rec OFS $1} !(NR%3){print rec; rec=""}' file | column -t
apropos  awk   chsh
date     grep  i3
如果不使用管道连接到列,也不希望选择任意数字作为字段宽度,则需要awk对输入文件进行两次遍历,以在打印前首先计算出每列的最大宽度,请参见

wrt第一个示例-在不以换行符结尾的输入上运行任何UNIX工具都依赖于POSIX规范中未定义的行为,因此如果您的列在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
非awk解决方案

$ cut -d' ' -f1 <file | paste - - - | column -t

apropos    awk   chsh
date       grep  i3
ip6tables
非awk解决方案

$ cut -d' ' -f1 <file | paste - - - | column -t

apropos    awk   chsh
date       grep  i3
ip6tables

您希望ip6tables不显示在输出中,因为它不是3的倍数的一部分?我正在查找要输出的第一列的所有内容。不管它是3的倍数。那么您的预期输出将显示它。您希望ip6tables不显示在输出中,因为它不是3的倍数的一部分吗?我正在查找要输出的所有第一列。不管它是3的倍数。那么你的预期输出就会显示出来。这是预期的。有没有可能让我了解一下你的awk陈述是如何运作的?我还在学习,总是对理解感兴趣。@Barebly查找ORS,FS,RS,awk手册页中的NR,然后重新阅读脚本,如果需要,添加一些打印,以查看正在测试/设置的值,您可能会立即理解这些值,但如果没有,请告诉我您是否有任何具体问题,我很乐意回答。这按预期进行。有没有可能让我了解一下你的awk陈述是如何运作的?我仍在学习,并且始终对理解感兴趣。@barefly在awk手册页中查找ORS、FS、RS和NR,然后重新阅读脚本。如果需要,添加一些打印,以查看测试/设置的值,您可能会立即理解它们,但如果没有,请告诉我您是否有任何具体问题,我很乐意回答。