awk

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
awk [2016/05/11 15:37] mumeiyamibitoawk [2018/03/13 16:46] (現在) – [シェル変数をパターンとして引き渡す] mumeiyamibito
行 20: 行 20:
   * バッチファイル1 (awk に読み込ませる)\\ <code bash>$ awk [オプション] -f バッチファイル データ</code>   * バッチファイル1 (awk に読み込ませる)\\ <code bash>$ awk [オプション] -f バッチファイル データ</code>
     * バッチファイルとは awk の処理内容を記述したファイル     * バッチファイルとは awk の処理内容を記述したファイル
-  * バッチファイル2 (単体で動かす) \\ <code bash> +  * バッチファイル2 (単体で動かす) \\ <code bash>$ chmod +x バッチファイル
-$ chmod +x バッチファイル+
 $ ./バッチファイル データ $ ./バッチファイル データ
 </code> </code>
行 40: 行 39:
  
 ===== 構文 ===== ===== 構文 =====
-  * 全体のコード\\ <code>#!/usr/bin/awk+==== 全体のコード ==== 
 +<code>#!/usr/bin/awk
 BEGIN{ BEGIN{
  開始処理  開始処理
行 54: 行 54:
  終了処理  終了処理
 }</code> }</code>
 +==== 変数 ====
   * 変数   * 変数
     * $0: レコード (行全体)     * $0: レコード (行全体)
     * $1, $2, $3, ...: フィールドの各データ     * $1, $2, $3, ...: フィールドの各データ
-    * 変数は自分で定義することも可能+    * 変数は自分で定義することも可能 (定義は不要)
   * よく使う組み込み変数   * よく使う組み込み変数
     * FS: 区切り文字 (データ間を区切る文字)     * FS: 区切り文字 (データ間を区切る文字)
       * オプション ''-F 区切り文字'' で変更可 (区切り文字は正規表現での表現可)       * オプション ''-F 区切り文字'' で変更可 (区切り文字は正規表現での表現可)
-  * 改行 + 
-    * 複数1行にしたい(ワンライナー)場合、「;」が改行の代わりになる +==== 配列 ==== 
-  * よく使う関数 +  * 複数のデータひとまとめにした変数 
-    * print +  定義は不要 
-      * 変数の中身などを出力 +  配列インックスは 1 から始まる (0 でない
-      print の後に括弧を付けない + 
-      複数のデータを表示す場合、スペースで区切って列挙 (例: print $1 "\t" $2 $3+==== 演算子 ====
-      * スペースやタブを出力したい場合は、''" "'' や ''"\t"'' を変数の間に入れる+
   * 演算   * 演算
     * 四則演算が使える     * 四則演算が使える
行 74: 行 74:
     * インクリメンタル (++) やデクリメント (--) が使える     * インクリメンタル (++) やデクリメント (--) が使える
     * 代入演算子 (+= や -= など) が使える     * 代入演算子 (+= や -= など) が使える
 +
 +==== if ====
 +  * 条件を分岐する場合\\ <code>
 +if (条件1){
 + 処理1
 +else if (条件2){
 + 処理2
 +}
 +else{
 + 処理3
 +}</code>
 +  * 例:\\ <code>
 +if (i == 0){
 + print "0"
 +}
 +else if (0 < i && i < 10){
 + print "1-9"
 +}
 +else{
 + print "10 over"
 +}
 +</code>
 +  * 条件式で使える記号
 +    * <, >, <=, =>, == (数値、文字列の比較に使う), !=
 +    * &&, ||
 +    * 正規表現では ~ で正規表現とつなげる (例: i ~ /hoge/)
 +
 +
 +==== for ====
 +  * 繰り返し処理をする場合に使う\\ <code>
 +for (変数の初期化; 変数の条件式; 変数の変化){
 + 処理
 +}
 +</code>
 +    * C 言語の for 文と一緒
 +  * 例\\ <code>
 +for (i = 0; i < 3; i ++){
 + print "Hello"
 +}
 +</code>Hello を 3 回出力
 +
 +==== よく使う関数 ====
 +  * print\\ <code>print "文字列"</code>
 +    * 変数の中身などを出力
 +    * 複数のデータを表示する場合は、スペースで区切って列挙 (例: print $1 "\t" $2 $3)
 +    * スペースやタブを出力したい場合は、''" "'' や ''"\t"'' を変数の間に入れる
 +  * printf\\ <code>printf("フォーマット", 値)</code>
 +    * C 言語の printf と同じく、変数の内容を整形して表示
 +    * %s: 文字列 (s の前に整数があると、スペースでその数だけの幅に整形する; 正の整数を入れると右揃え、負の整数を入れると左揃え)
 +    * %d: 整数 (d の前に整数があると、スペースでその数だけの幅に整形する; 正の整数を入れると右揃え、負の整数を入れると左揃え)
 +    * %f: 浮動小数 (f の前に小数があると、整数部を全体の幅、小数部を小数点以下の桁数にする; 整数部の前に 0 を付けると、ゼロで空白部を埋める)
 +  * sub, gsub\\ <code>sub(正規表現, 置換後の文字列, 対象とする文字列)</code>
 +    * 文字列の置換をする
 +    * sub は 1 回のみ、gsub は繰り返し置換 (正規表現の s/str/replace/g) みたいなもの
 +      * 例: str = 'banana' として、a を "" (削除) する場合
 +        * sub\\ <code>sub(/a/, "", str)</code> ⇒ bnana
 +        * gsub\\ <code>gsub(/a/, "", str)</code> ⇒ bnn
 +  * split\\ <code>split(対象文字列, 配列, 区切り文字)</code>
 +    * **対象文字列** を **区切り文字** で区切って、**配列** に代入する関数
 +    * 返り値は、配列の要素数になる\\ <code>hoge = split("banana", data, "a")</code>hoge は 3、data には「b」「n」「n」が入る
 +  * length\\ <code>length(配列)</code>
 +    * 文字列や配列の長さを出力
 +
 +==== その他 ====
 +  * 改行
 +    * 複数行を1行にしたい(ワンライナー)場合、「;」が改行の代わりになる
  
 ===== awk プログラムの例 ===== ===== awk プログラムの例 =====
 ==== 合計と平均算出 ==== ==== 合計と平均算出 ====
   * 対象データ: 第1フィールドにステップ数、第2フィールドに値があるデータ   * 対象データ: 第1フィールドにステップ数、第2フィールドに値があるデータ
-  * コード\\ <code awk sumaverage.awk>#!/usr/bin/awk+  * コード (バッチファイル)\\ <code awk sumaverage.awk> 
 +#!/usr/bin/awk -f
 BEGIN{ BEGIN{
  total = 0  total = 0
行 95: 行 162:
 } }
 </code> </code>
 +  * 実行方法
 +    * バッチファイル\\ <code bash>$ awk -f sumaverage.awk data.txt</code>
 +    * バッチファイル単体\\ <code bash>
 +$ chmod +x sumaverage.awk
 +$ ./sumaverage.awk data.txt
 +</code>
 +    * コード (ワンライナー)\\ <code bash>
 +$ awk 'BEGIN{total = 0; count = 0} $0!~/^#/{total += $2; count ++} END{average = total / count; print "Total: " total; print "Average: " average}'
 +</code>
 +
 +===== Tips =====
 +==== シェル変数をパターンとして引き渡す ====
 +  * ''-v'' オプションで変数を渡しつつ、''$0 ~ VAR'' でマッチさせる\\ <code bash>$ awk -v VAR '$0 ~ VAR{print $0}' FILE</code>
 +    * ''VAR'' は変数名
 +    * ''FILE'' は処理するファイル名
 +  * 参考サイト: [[https://stackoverflow.com/questions/39384283/how-to-match-a-pattern-given-in-a-variable-in-awk | regex - How to match a pattern given in a variable in awk? - Stack Overflow]]
 +
  
 ===== 参考サイト ===== ===== 参考サイト =====
行 101: 行 185:
   * [[http://www.techscore.com/blog/2012/11/19/%E3%81%82%E3%81%88%E3%81%A6%E8%A8%80%E3%81%86%E3%81%BB%E3%81%A9%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%81%91%E3%82%8C%E3%81%A9%E3%82%82%E3%80%81awk%E3%81%AE%E5%8C%BA%E5%88%87%E3%82%8A%E6%96%87/ | » あえて言うほどではないけれども、awkの区切り文字について TECHSCORE BLOG]] 区切り文字   * [[http://www.techscore.com/blog/2012/11/19/%E3%81%82%E3%81%88%E3%81%A6%E8%A8%80%E3%81%86%E3%81%BB%E3%81%A9%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%81%91%E3%82%8C%E3%81%A9%E3%82%82%E3%80%81awk%E3%81%AE%E5%8C%BA%E5%88%87%E3%82%8A%E6%96%87/ | » あえて言うほどではないけれども、awkの区切り文字について TECHSCORE BLOG]] 区切り文字
   * [[http://itdoc.hitachi.co.jp/manuals/3020/30203S3530/JPAS0241.HTM | awkコマンド(テキストの加工やパターン処理をする)]]   * [[http://itdoc.hitachi.co.jp/manuals/3020/30203S3530/JPAS0241.HTM | awkコマンド(テキストの加工やパターン処理をする)]]
 +  * [[http://shellscript.sunone.me/awk.html | AWK リファレンス | UNIX & Linux コマンド・シェルスクリプト リファレンス]]
  
 +{{tag>プログラミング コマンド}}
  • awk.1462948620.txt.gz
  • 最終更新: 2016/05/11 15:37
  • by mumeiyamibito