awk

差分

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

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
awk [2016/05/11 16:48] mumeiyamibitoawk [2018/03/13 16:46] (現在) – [シェル変数をパターンとして引き渡す] mumeiyamibito
行 58: 行 58:
     * $0: レコード (行全体)     * $0: レコード (行全体)
     * $1, $2, $3, ...: フィールドの各データ     * $1, $2, $3, ...: フィールドの各データ
-    * 変数は自分で定義することも可能+    * 変数は自分で定義することも可能 (定義は不要)
   * よく使う組み込み変数   * よく使う組み込み変数
     * FS: 区切り文字 (データ間を区切る文字)     * FS: 区切り文字 (データ間を区切る文字)
       * オプション ''-F 区切り文字'' で変更可 (区切り文字は正規表現での表現可)       * オプション ''-F 区切り文字'' で変更可 (区切り文字は正規表現での表現可)
-==== その他 ==== 
-  * 改行 
-    * 複数行を1行にしたい(ワンライナー)場合、「;」が改行の代わりになる 
  
-==== 関数 ==== +==== 配列 ==== 
-  * よく使う関 +  * のデータをひとまとめにした変数 
-    * print +  定義は不要 
-      * 変数の中身などを出力 +  配列インックスは 1 から始まる (0 でない
-      print の後に括弧を付けない +
-      複数のデータを表示す場合、スペースで区切って列挙 (例: print $1 "\t" $2 $3+
-      * スペースやタブを出力したい場合は、''" "'' や ''"\t"'' を変数の間に入れる+
 ==== 演算子 ==== ==== 演算子 ====
   * 演算   * 演算
行 79: 行 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 プログラムの例 =====
行 110: 行 171:
 $ awk 'BEGIN{total = 0; count = 0} $0!~/^#/{total += $2; count ++} END{average = total / count; print "Total: " total; print "Average: " average}' $ awk 'BEGIN{total = 0; count = 0} $0!~/^#/{total += $2; count ++} END{average = total / count; print "Total: " total; print "Average: " average}'
 </code> </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]]
 +
  
 ===== 参考サイト ===== ===== 参考サイト =====
行 116: 行 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.1462952906.txt.gz
  • 最終更新: 2016/05/11 16:48
  • by mumeiyamibito