使用awk按表格格式化顯示

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.