awkを使って表のフォーマットで表示します。
2279 ワード
本論文のリンク:http://blog.csdn.net/kongxx/article/details/8284952
今日の仕事で問題があったら、コマンドラインの出力をフィルタリングして、結果を同じ表の形式で出力します。
ここでは命令の出力を下記のように仮定して、いくつかの列や行をフィルタリングしたとします。ここでtest.txtファイルに保存します。
次にBEGINの部分で、二つの変数が定義されています。ローソンはテキストの内容が全部で何行あるかを示すために使われます。ここでは空行問題を考慮してNR変数が使用されていません。colsは最終的に表示する列の数を定義するために使用されます。ここでは、すべての列が必要であると仮定して、5と定義されています。
アクション部分は、処理しましたので、列は5の行です。ここでは必要に応じて自分のフィルタ条件を書いてもいいです。上の例では、方面のためにフィルタリングをしたことがありません。この部分は2つのサイクルを使用しています。最初のサイクルは、その行の列の最大長さを計算し、lengths配列に保存します。第二のループは、必要なデータを二次元配列に配置することである。
最後にEND部分であり、この部分も2つのサイクルを含みます。最初のサイクルは各列の最大長さを4つずつ加えることです。目的は各列の間にいくつかの間隔を加えることです。第二のループは、Name,DesignationおよびDepartment列を左に揃えて、数字列を右に揃えて出力をフォーマットするために使用されます。
テストは、コマンドラインでawk-f test.awk test.txtコマンドを実行すると、次のような結果が得られます。
今日の仕事で問題があったら、コマンドラインの出力をフィルタリングして、結果を同じ表の形式で出力します。
ここでは命令の出力を下記のように仮定して、いくつかの列や行をフィルタリングしたとします。ここで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