awkを使って表のフォーマットで表示します。

2279 ワード

本論文のリンク: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])
	}
}
はまずフォーマットが必要な文字列です。第二のパラメータは文字列を長い文字列にフォーマットする必要があります。第三のパラメータは文字列の長さがmaxlenより小さい場合、前か後ろにスペースを埋めるための表です。
次にBEGINの部分で、二つの変数が定義されています。ローソンはテキストの内容が全部で何行あるかを示すために使われます。ここでは空行問題を考慮してNR変数が使用されていません。colsは最終的に表示する列の数を定義するために使用されます。ここでは、すべての列が必要であると仮定して、5と定義されています。
アクション部分は、処理しましたので、列は5の行です。ここでは必要に応じて自分のフィルタ条件を書いてもいいです。上の例では、方面のためにフィルタリングをしたことがありません。この部分は2つのサイクルを使用しています。最初のサイクルは、その行の列の最大長さを計算し、lengths配列に保存します。第二のループは、必要なデータを二次元配列に配置することである。
最後にEND部分であり、この部分も2つのサイクルを含みます。最初のサイクルは各列の最大長さを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