本文連結: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