ウェブサイト検索

Awk プログラミング言語を使用してスクリプトを記述するにはどうすればよいですか?


Awk は強力なテキスト処理言語で、その名前はその 3 人のオリジナル作者、Alfred Aho、Peter Weinberger、Brian Kernighan にちなんで命名されました。これは主にパターンのスキャンと処理に使用される多用途言語です。 Awk は Unix スクリプトの定番であり、データ抽出、レポート、データ変換などのタスクに一般的に使用されます。

awk スクリプトは迅速に記述でき、小規模から中規模のタスクに適したパフォーマンスを発揮します。この記事では、Awk プログラミング言語を使用したスクリプト作成の基本を紹介します。

基本的な構文

Awk プログラムは、次のように書かれたパターンとアクションのペアのシーケンスで構成されています-

pattern { action }

ここで、パターンは条件です。入力行がパターンと一致する場合、アクションが実行されます。

たとえば-

awk '/search_pattern/ { print $0 }' file_name

この例では、awk は file_name から search_pattern を含む行を検索し、一致する場合は行全体 ($0) を出力します。

変数の使用

Awk には、出力のフォーマットに使用できる組み込み変数があります。最も一般的なものは次のとおりです-

  • $0 - 行全体。

  • $1、$2、... - それぞれの個別のフィールド (デフォルトは空白で区切られています)。

  • FS - フィールド区切り文字 (デフォルトはスペース)。

  • OFS - 出力フィールド区切り文字 (デフォルトはスペース)。

  • NR - 処理されたレコードの数。

  • NF - 現在のレコード内のフィールドの数。

これらの変数のいくつかを使用した実際の例を見てみましょう。次の内容を含む「students.txt」という名前のテキストファイルがあると仮定します-

John Doe 18
Jane Smith 19

awk を使用して名前と年齢を別々に出力できます-

awk '{ print "Name: " $1 " " $2 ", Age: " $3 }' students.txt

出力は次のようになります-

Name: John Doe, Age: 18
Name: Jane Smith, Age: 19

制御フロー

Awk は、if、else、while、for などの一般的な制御フロー メカニズムもサポートしています。これはifとelseを使用した例です-

awk '{ if ($3 > 18) print $1 " is an adult"; else print $1 " is a minor"}' students.txt

出力は次のようになります-

John is an adult
Jane is a minor

機能

Awk には、文字列操作、算術演算、入出力などのための組み込み関数があります。独自の関数を定義することもできます。

これは、温度を華氏から摂氏に変換するユーザー定義関数の例です-

function toCelsius(fahrenheit) {
   return (fahrenheit - 32) * 5/9
}

BEGIN { print "Fahrenheit Celsius" }
{ print $1, toCelsius($1) }

華氏温度を含む入力ファイル「temperatures.txt」がある場合-

32
212

出力は次のようになります-

Fahrenheit Celsius
32 0
212 100

正規表現

Awk は、パターン マッチングで使用できる正規表現構文をサポートしています。これは、文字「J」で始まる「students.txt」内の行を検索する基本的な例です-

awk '/^J/ { print $0 }' students.txt

この場合、キャレット (^) 記号は行の始まりを表します。このスクリプトは出力します-

John Doe 18
Jane Smith 19

配列

Awk は、より複雑なデータ操作に使用できる 1 次元配列をサポートしています。 「students.txt」ファイル内の年齢の出現をカウントしたい場合を考えてみましょう。その方法は次のとおりです-

awk '{ count[$3]++ } END { for (age in count) print age " appears " count[age] " times." }' students.txt

これは出力されます-

18 appears 1 times.
19 appears 1 times.

このスクリプトでは、count[$3]++ は配列のキーとして年齢 (3 番目のフィールド) を使用し、出現するたびにその値をインクリメントします。

高度なデータ操作

Awk は、より高度なデータ操作のためのいくつかの組み込み関数も提供します。たとえば、文字列を配列に分割できる Split() 関数を提供します-

awk '{ split($1, array, ""); print "First letter of the name: " array[1] }' students.txt

このスクリプトは出力します-

First letter of the name: J
First letter of the name: J

Awk と他の Unix コマンドの組み合わせ

パイプ (|) を使用して Awk スクリプトを他の Unix コマンドと組み合わせることができ、これによりさらに強力なツールになります-

cat students.txt | awk '{ print $1 }' | sort | uniq

このコマンドは、生徒の名を出力し、並べ替えて、重複を削除します。この場合、出力は次のようになります-

Jane
John

Awk でのスクリプトの使用

単純なタスクの場合はターミナルで Awk を直接使用するのが一般的ですが、より複雑な操作の場合はスクリプトを作成した方が便利な場合があります。 awk スクリプトは同じパターンとアクションの構造に従いますが、別のファイルに記述されます。

まず、.awk 拡張子を持つ新しいファイルを作成します。スクリプトの先頭行は、Awk インタープリターを指すシバン行である必要があります-

#!/usr/bin/awk -f

学生の平均年齢を計算する「students.awk」というAwkスクリプトを作成しましょう-

#!/usr/bin/awk -f
BEGIN { 
   sum = 0
   count = 0
}
{ 
   sum += $3
   count++ 
}
END {
   print "Average age: " sum/count
}

スクリプトを実行するには、chmod +x students.awk で実行可能にしてから、./students.awk students.txt で実行します。これは印刷されます-

Average age: 18.5

Awk スクリプトのデバッグ

Awk スクリプトのデバッグは、組み込みのデバッグ ツールがないため、少し難しい場合があります。ただし、print ステートメントを使用して、スクリプト内のさまざまな時点で変数の値を表示すると便利な場合があります。

また、-W dump-variables[=file] オプションを使用すると、すべての変数と配列をデバッグ用にファイルにダンプできます。このオプションを使用するには、awk -W dump-variables=dump.txt script.awk を実行します。

高度なパターン マッチング

Awk は、正規表現を使用した高度なパターン マッチングもサポートしています。たとえば、~ 演算子を使用して、フィールドを正規表現と照合できます。

彼らが勉強しているコースの追加フィールドを含むstudents.txtファイルを考えてみましょう-

John Doe 18 ComputerScience
Jane Smith 19 Mathematics

コンピューターサイエンスを勉強している学生を見つけるには、次のように書くことができます-

awk '$4 ~ /ComputerScience/ { print $1 " " $2 " is studying Computer Science." }' students.txt

これは出力されます-

John Doe is studying Computer Science.

結論

Awk は、Unix ベースのシステム上でテキストを処理するための強力なツールです。その威力は、そのシンプルさと構文の単純な性質にあります。テキストを操作する場合でも、算術計算を実行する場合でも、Awk はプログラミング ツールキットに含めるべき優れたツールです。

Awk (または他の言語) を学習する最善の方法は、Awk を使用することであることを忘れないでください。独自の Awk スクリプトを作成してみてください。単純なタスクから始めて、言語に慣れてきたら徐々に複雑なタスクに移行してください。