使用awk按表格格式化显示

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


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

这里假定有一个命令的输出如下,假定我们过滤掉了其中某些列或者行,这里我们将其存入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
下面是一个简单的awk文件,将其保存到test.awk文件里。

function format(value, maxlen, align) {
	len=length(value);
	lendiff=maxlen-len;
	if (lendiff>0) {
		for (k=0; k 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






你可能感兴趣的:(使用awk按表格格式化显示)