この記事は、進行中の Awk チュートリアルとサンプル シリーズの一部です。他のプログラミング言語と同様に、Awk にもユーザー定義変数と組み込み変数があります。
この記事では、awk 変数の定義と使用方法を確認します。 .
- awk 変数は文字で始まる必要があり、その後に英数字またはアンダースコアを使用できます。
- キーワードは awk 変数として使用できません
- Awk は、他のプログラミング言語のような変数宣言をサポートしていません
- 最初に 1 回だけ実行される BEGIN セクションで awk 変数を初期化することをお勧めします。
- Awk にはデータ型がありません。 awk 変数が数値として扱われるか文字列として扱われるかは、使用されるコンテキストによって異なります。
ユーザー定義の awk 変数の使用方法を学ぶために、いくつかの簡単な例を確認してみましょう。
Awk の例 1:書籍の請求
この例では、入力ファイル bookdetails.txt には、項目番号、書籍名、数量、書籍あたりの料金などのフィールドを持つレコードが含まれています。
$ cat bookdetails.txt 1 Linux-programming 2 450 2 Advanced-Linux 3 300 3 Computer-Networks 4 400 4 OOAD&UML 3 450 5 Java2 5 200
次の Awk スクリプトは、上記の bookdetails.txt ファイルを読み取って処理し、販売された各書籍の割合と、販売されたすべての書籍の合計金額を表示するレポートを生成します。
これまでのところ、Awk がコマンドラインからコマンドを読み取るのを見てきましたが、Awk は -f オプションを使用してファイルからコマンドを読み取ることもできます。
Syntax: $ awk -f script-filename inputfilename
書籍の課金計算用の Awk スクリプトを以下に示します。
$ cat book-calculation.awk BEGIN { total=0; } { itemno=$1; book=$2; bookamount=$3*$4; total=total+bookamount; print itemno," ", book,"\t","$"bookamount; } END { print "Total Amount = $"total; }
上記のスクリプトでは、
- Awk BEGIN セクション 変数 total を初期化します。 itemno、total、book、bookmount はユーザー定義の awk 変数です。
- Awk アクションで セクションでは、Quantity*bookprice が bookamount という変数に格納されます。各簿価が合計に加算されます。
- ついにオークに END セクション、合計変数には合計金額があります。
ここで book-calculation.awk スクリプトを実行して、以下に示すように、各帳簿レートと合計金額を表示するレポートを生成します。
$ awk -f book-calculation.awk bookdetails.txt 1 Linux-programming $900 2 Advanced-Linux $900 3 Computer-Networks $1600 4 OOAD&UML $1350 5 Java2 $1000 Total Amount = $5750
Awk の例 2. 学生の成績の計算
この例では、次の内容で入力ファイル「student-marks.txt」を作成します — 生徒の名前、ロール番号、テスト 1 のスコア、テスト 2 のスコア、およびテスト 3 のスコア。
$ cat student-marks.txt Jones 2143 78 84 77 Gondrol 2321 56 58 45 RinRao 2122 38 37 65 Edwin 2537 78 67 45 Dayan 2415 30 47 20
次の Awk スクリプトは、各学生の平均点、テスト 1、テスト 2、およびテスト 3 のスコアの平均を示すレポートを計算して生成します。
$cat student.awk BEGIN { test1=0; test2=0; test3=0; print "Name\tRollNo\t Average Score"; } { total=$3+$4+$5; test1=test1+$3; test2=test2+$4; test3=test3+$5; print $1"\t"$2"\t",total/3; } END{ print "Average of Test1="test1/NR; print "Average of Test2="test2/NR; print "Average of Test3="test3/NR; }
上記の Awk スクリプトでは、
- Awk BEGIN で セクションでは、すべての awk 変数がゼロに初期化されます。 test1、test2、test3、および total は、ユーザー定義の awk 変数です。
- Awk アクションで セクション、$3、$4、$5 はそれぞれ Test1、Test2、Test3 のスコアです。合計変数は、各学生の 3 つのテスト スコアの追加です。 awk 変数 test1、test2、および test3 には、対応する各テストの合計スコアがあります。
- では、Awk END で セクションで、各テストの合計をレコード (つまり、学生) の合計数で割ると、平均スコアが得られます。 NR Awk 組み込み変数です これにより、入力内のレコードの総数が得られます。
Awk の例 3. 生徒の詳細に関する HTML レポート
上記の 2 つの例では、数値を値として持つ awk 変数を見てきました。この例は、生徒の名前とロール番号の HTML レポートを生成する awk スクリプトを示しています。
$ cat string.awk BEGIN{ title="AWK"; print "<html>\n<title>"title"</title><body bgcolor=\"#ffffff\">\n<table border=1><th colspan=2 align=centre>Student Details</th>"; } { name=$1; rollno=$2; print "<tr><td>"name"</td><td>"rollno"</td></tr>"; } END { print "</table></body>\n</html>"; }
上記の例で作成したものと同じ student-marks.txt 入力ファイルを使用してください。
$ awk -f string.awk student-marks.txt <html> <title>AWK</title><body bgcolor="#ffffff"> <table border=1><th colspan=2 align=centre>Student Details</th> <tr><td>Jones</td><td>2143</td></tr> <tr><td>Gondrol</td><td>2321</td></tr> <tr><td>RinRao</td><td>2122</td></tr> <tr><td>Edwin</td><td>2537</td></tr> <tr><td>Dayan</td><td>2415</td></tr> </table></body> </html>
上記の出力を保存すると、次の html テーブルが得られます。上記のスクリプトでは、name と rollno という名前の変数は、文字列コンテキストで使用されるため、文字列変数です。
Student Details | |
---|---|
Jones | 2143 |
Gondrol | 2321 |
RinRao | 2122 |
Edwin | 2537 |
Dayan | 2415 |
推奨読書
<強い> Ramesh Natarajan による Sed と Awk の 101 ハック .テキスト ファイル (データ、構成、およびログ ファイル) を扱う UNIX/Linux 環境で、1 日に数時間を費やしています。私はすべてのテキスト操作作業に Sed と Awk を使用しています。私の Sed と Awk の経験に基づいて、Sed と Awk のさまざまな高度な機能に関する 101 の実用的な例を含む Sed and Awk 101 Hacks eBook を書きました。これにより、UNIX/Linux の生活が向上します。 Sed と Awk を数年間使用しており、この本を読んでいない場合でも、ぜひこの本を読んでください。 Sed および Awk ユーティリティの機能に驚かれることでしょう。