Linux
 Computer >> コンピューター >  >> システム >> Linux

AWKコマンドとスクリプトの書き方入門

awkコマンドは、テキストファイルを処理・分析するための強力なツールです。特に、行(レコード)と列(フィールド)で構成されたデータファイルの解析に優れています。簡単なawkコマンドであればコマンドラインから直接実行できますが、より複雑な処理を行いたい場合は、awkプログラム(いわゆるawkスクリプト)としてファイルに記述するのがおすすめです。

AWKの基本

awkコマンドの基本形式は以下の通りです。

awk 'pattern {action}' input-file > output-file

これは「入力ファイルの各行を読み込み、その行がパターンに一致した場合、アクションを適用した結果を出力ファイルへ書き込む」という意味です。パターンを省略すると、すべての行に対してアクションが適用されます。例を見てみましょう。

awk '{ print $5 }' table1.txt > output1.txt

上記のコマンドは、各行の5番目の列の要素を取り出し、出力ファイル「output1.txt」に行として書き込みます。「$4」は4番目の列を参照し、同様に$1、$2、$3などで1番目、2番目、3番目の列にアクセスできます。デフォルトでは、列はスペースまたはタブ(いわゆる空白文字)で区切られているとみなされます。

たとえば、入力ファイル「table1.txt」に次のような行が含まれているとします。

1, Justin Timberlake, Title 545, Price $7.30
2, Taylor Swift, Title 723, Price $7.90
3, Mick Jagger, Title 610, Price $7.90
4, Lady Gaga, Title 118, Price $7.30
5, Johnny Cash, Title 482, Price $6.50
6, Elvis Presley, Title 335, Price $7.30
7, John Lennon, Title 271, Price $7.90
8, Michael Jackson, Title 373, Price $5.50

この状態で先ほどのコマンドを実行すると、出力ファイルには次の行が書き込まれます。

545,
723,
610,
118,
482,
335,
271,
373,

列の区切り文字がスペースやタブ以外の場合(カンマなど)は、「-F」オプションで区切り文字を指定できます。

awk -F, '{ print $3 }' table1.txt > output1.txt

このコマンドは、列がカンマで区切られているものとして、各行の3番目の列の要素を選択します。この場合の出力は次のようになります。

Title 545
Title 723
Title 610
Title 118
Title 482
Title 335
Title 271
Title 373

AWKでの条件式

波括弧({ })の中に記述されたステートメントのまとまりは「ブロック」と呼ばれます。ブロックの前に条件式を置くと、その条件が真の場合にのみブロック内のステートメントが実行されます。

awk '$7=="\$7.30" { print $3 }' table1.txt

この例での条件は$7=="\$7.30"、つまり「7番目の列の要素が$7.30と等しい」という意味です。ドル記号の前のバックスラッシュは、$7が変数として解釈されるのを防ぎ、ドル記号を文字どおりに扱うために付けています。

つまり、このawkステートメントは、7番目の列に「$7.30」が含まれる各行について、その3番目の列の要素を出力します。

また、正規表現を条件として使うことも可能です。例を挙げます。

awk '/30/ { print $3 }' table1.txt

2つのスラッシュ(/)で囲まれた文字列が正規表現です。この例では単純に「30」という文字列を指定しています。つまり、行に「30」という文字列が含まれている場合、その行の3番目の列の要素が出力されます。上記の例では、出力は次のようになります。

Timberlake,
Gaga,
Presley,

AWKでの計算処理

テーブルの要素が数値であれば、awkを使って計算を実行できます。たとえば次のように記述します。

awk '{ print ($2 * $3) + $7 }'

現在の行の各要素にアクセスする変数($1、$2など)のほかに、行全体を参照する変数$0や、フィールド(列)の数を保持する変数NFも用意されています。

さらに、新しい変数を自分で定義することもできます。次の例を見てください。

awk '{ sum=0; for (col=1; col<=NF; col++) sum += $col; print sum; }'

このスクリプトは、各行のすべての要素の合計値を計算して出力します。forループを使って各列の値を順番に加算している点に注目してください。

まとめ

awkは、テキストデータの列抽出、条件による絞り込み、数値の集計など、日常的なテキスト処理を効率化できる非常に便利なコマンドです。まずは基本的な構文を覚え、実際のデータファイルで試しながら慣れていくとよいでしょう。なお、awkステートメントはsedコマンドと組み合わせて使われることも多く、両方をマスターするとテキスト処理の幅が大きく広がります。

  1. 基本的なChrome拡張機能の作り方:マニフェスト作成からChromeへの読み込みまで

    Chromeは、世界で最も利用されているWebブラウザです。Statcounterのデスクトップブラウザ市場シェア調査によると、Chromeはデスクトップブラウザ市場のおよそ65%という圧倒的なシェアを誇っています。 これほど大きな市場を握っているため、Web制作においてChromeへの対応は最優先事項となっています。拡張機能についても同様で、Chromeは他のブラウザを大きく引き離す規模のユーザーベースを持ち、Chromeウェブストアには数万におよぶ拡張機能、テーマ、アプリが登録されています。 この流れに乗りたいなら、自分で基本的なChrome拡張機能を作ってみるのがおすすめです。必要なの

  2. iOS 13でNFCタグを読み書きする方法|iPhoneでの設定手順をわかりやすく解説

    近年のスマートフォンには、端末同士で情報をやり取りできる「NFC」という機能が搭載されています。NFCは「Near Field Communication(近距離無線通信)」の略称で、スマートフォンとの間で情報を送受信できる無線通信技術のことです。 この機能を使えば、製品やサービス、観光名所などに関する情報に瞬時にアクセスできます。デバイスをワイヤレスで接続するには、NFCに対応したスマートタグ、いわゆる「NFCタグ」が必要です。 本記事では、NFCタグの基本知識から、iPhone(iOS 13)を使ったNFCタグの読み書き方法まで、詳しく解説します。 NFCタグとは? NFCタグとは、NFC