使用awk按表格格式化显示

来源:互联网 发布:短信 群发 软件 编辑:程序博客网 时间:2024/04/29 21:59


本文链接:http://blog.csdn.net/kongxx/article/details/8284952


今天工作中碰到一个问题,需要过滤一些命令行的输出,并且将结果按类似表格的格式输出

这里假定有一个命令的输出如下,假定我们过滤掉了其中某些列或者行,这里我们将其存入test.txt文件

ID   Name    Designation    Department  Salary100  Thomas  Manager        Sales       $5,000200  Jason   Developer      Technology  $5,500300  Sanjay  Sysadmin       Technology  $7,000400  Nisha   Manager        Marketing   $9,500500  Randy   DBA            Technology  $6,000
下面是一个简单的awk文件,将其保存到test.awk文件里。
function format(value, maxlen, align) {len=length(value);lendiff=maxlen-len;if (lendiff>0) {for (k=0; k<lendiff; k++) {if(align=="right") {value=value" ";} else {value=" "value;}}}return value;}BEGIN {rows=0;cols=5;}{if(NF==cols) {for(i=1; i<=NF; i++) {if (length($i) > lengths[i]) lengths[i]=length($i);}rows++;for(col=1; col<=NF; col++) {data[rows, col]=$col;}}}END {for(i=1; i<=length(lengths); i++) {lengths[i]=lengths[i]+4;}for(i=1; i<=rows; i++) {print format(data[i, 1], lengths[1]), format(data[i, 2], lengths[2], "right"), format(data[i, 3], lengths[3], "right"), format(data[i, 4], lengths[4], "right"), format(data[i, 5], lengths[5])}}
首先是一个format函数,用来格式化某些字符串,这个函数包含三个参数:第一个参数value是需要格式化的字符串,第二个参数是需要把字符串格式化成多长的字符串,第三个参数是用来表示当字符串长度小于maxlen时,在前面还是在后面补空格。

接下来是BEGIN部分,定义了两个变量,rows是用来表示文本内容共有多少行需要处理,这里考虑到空行问题所以没有使用NR变量;cols是用来定义最终需要显示的列数,这里假定全部列都需要,所以定义成5.

Action部分,处理了所以列是5的的行,这里根据需要可以写自己的过滤条件,上面例子里为了方面没有做过多过滤;这部分使用了两个循环:第一个循环用来计算所以行中每一列的最大长度,并将其保存在lengths数组中;第二个循环是将所以需要的数据放到一个二维数组中;

最后是END部分,此部分也包括两个循环:第一个循环是将每一列的最大长度加4,目的是为了在每一列之间加一些间隔;第二个循环是用来格式化输出的,其中将Name,Designation和Department列左对齐,数字列右对齐。


测试,在命令行运行awk -f test.awk test.txt命令,可以得到如下结果

     ID Name       Designation     Department         Salary    100 Thomas     Manager         Sales              $5,000    200 Jason      Developer       Technology         $5,500    300 Sanjay     Sysadmin        Technology         $7,000    400 Nisha      Manager         Marketing          $9,500    500 Randy      DBA             Technology         $6,000

http://blog.csdn.net/kongxx/article/details/8284952

0 0
原创粉丝点击