GNU/Linux >> Linux の 問題 >  >> Linux

Awk チュートリアル:3 つの実践例で Awk 変数を理解する

この記事は、進行中の 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 ユーティリティの機能に驚かれることでしょう。


Linux
  1. Awk 入門チュートリアル – 7 つの Awk 印刷例

  2. Perl 配列参照と逆参照のチュートリアルと実践例

  3. 実際の例を含むエコーコマンド

  1. 例を使用したBashヒアドキュメントチュートリアル

  2. 5つの実用的な例で説明されたAWK配列

  3. 実際の例を含む Bash シェルの終了ステータスのチュートリアル

  1. LinuxでのAWKコマンドと例

  2. Linux /UNIXAwkコマンドチュートリアルと例

  3. 例を含むLinuxzforceコマンドチュートリアル