awk

文書の過去の版を表示しています。


awk

  • プログラミング言語の1つ
  • 特定の文字で区切られたデータが記述されたテキストを処理する際に便利
  • 現在の Linux ディストリビューションで使える awk の実体は awk ではなく、gawk (awk は gawk のリンクになっている)
  • 1行ずつ処理していく
  • 以下の順にプログラムは進む
    • 前処理: BEGIN{…}
      • 省略可
    • 本処理: {…}
      • {…} の前にパターン (正規表現可) をつけると、パターンの行のみ処理する
    • 後処理: END{…}
      • 省略可
  • awk にはファイル保存機能はないため、リダイレクトやパイプを使ってデータを保存したり、渡したりする
  • ワンライナー
    $ awk [オプション] '処理内容' データ
  • バッチファイル1 (awk に読み込ませる)
    $ awk [オプション] -f バッチファイル データ
    • バッチファイルとは awk の処理内容を記述したファイル
  • バッチファイル2 (単体で動かす)
    $ chmod +x バッチファイル
    $ ./バッチファイル データ
    • ただし、バッチファイルの先頭に #!/usr/bin/awk -f を付けること (/usr/bin/awk は環境によって異なるので、which コマンドなどで確認すること)
  • パイプデータ処理
    $ コマンド | awk [オプション]
表記 効果 備考
-F 区切り文字区切り文字(入力フィールドセパレータ)の変更
-v 変数名=変数値awk 内に変数を渡すシェル内での実行の際、シェル変数を awk に渡したい時に使う
-f バッチファイルバッチファイルに記述した処理をする
  • レコード: 入力レコードセパレータで分割されたデータ
  • フィールド: フィールドセパレータで分割されたデータ
  • 全体のコード
    #!/usr/bin/awk
    BEGIN{
    	開始処理
    }
    /正規表現パターン1/{
    	パターン1に対する処理
    }
    /正規表現パターン2/{
    	パターン2に対する処理
    }
    :
    END{
    	終了処理
    }
  • 変数
    • $0: レコード (行全体)
    • $1, $2, $3, …: フィールドの各データ
    • 変数は自分で定義することも可能
  • よく使う組み込み変数
    • FS: 区切り文字 (データ間を区切る文字)
      • オプション -F 区切り文字 で変更可 (区切り文字は正規表現での表現可)
  • 改行
    • 複数行を1行にしたい(ワンライナー)場合、「;」が改行の代わりになる
  • よく使う関数
    • print
      • 変数の中身などを出力
      • print の後に括弧を付けない
      • 複数のデータを表示する場合は、スペースで区切って列挙 (例: print $1 "\t" $2 $3)
      • スペースやタブを出力したい場合は、“ ”“\t” を変数の間に入れる
  • 演算
    • 四則演算が使える
      • +, -, *, /
    • インクリメンタル (++) やデクリメント (–) が使える
    • 代入演算子 (+= や -= など) が使える
  • 対象データ: 第1フィールドにステップ数、第2フィールドに値があるデータ
  • コード
    sumaverage.awk
    #!/usr/bin/awk
    BEGIN{
    	total = 0
    	count = 0
    }
     
    $0 !~ /^#/{
    	total += $2
    	count ++
    }
     
    END{
    	average = total / count
    	print "Total: " total
    	print "Average: " average
    }
  • awk.1462948620.txt.gz
  • 最終更新: 2016/05/11 15:37
  • by mumeiyamibito