usptomonokai 20111028

18
Japan GNU AWK Users' Club gauc.no-ip.org USP 友の会総会 (2011/10/28) AWK AWK アクションレス アクションレス アクションレス アクションレス アクションレス アクションレス アクションレス アクションレス プログラミング プログラミング プログラミング プログラミング プログラミング プログラミング プログラミング プログラミング 日本 GNU AWK ユーザー会 斉藤 博文 (@hi_saito)

Upload: hirofumi-saito

Post on 08-Jul-2015

499 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

AWK AWK でででででででで

アクションレスアクションレスアクションレスアクションレスアクションレスアクションレスアクションレスアクションレス・・・・・・・・プログラミングプログラミングプログラミングプログラミングプログラミングプログラミングプログラミングプログラミング

日本 GNU AWK ユーザー会

斉藤 博文 (@hi_saito)

Page 2: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

AWK AWK のののの基本文法基本文法基本文法基本文法のののの基本文法基本文法基本文法基本文法

BEGIN { ACTION }

PATTERN { ACTION }

END { ACTION }

Point!

• BEGIN や END も同じ PATTERN と考えると分かりやすいね

• ついでに K&R スタイルで書くと統一感が出るね

Page 3: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

K&R K&R スタイルスタイルスタイルスタイルってってってって何何何何スタイルスタイルスタイルスタイルってってってって何何何何??

if (なんとかなんとかなんとかなんとか)

{

かんとかかんとかかんとかかんとか;

}

if (なんとかなんとかなんとかなんとか) {

かんとかかんとかかんとかかんとか;

}

オールドマンスタイルオールドマンスタイルオールドマンスタイルオールドマンスタイルオールドマンスタイルオールドマンスタイルオールドマンスタイルオールドマンスタイル

K&R K&R スタイルスタイルスタイルスタイルスタイルスタイルスタイルスタイル

Page 4: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

パターンパターンパターンパターンはははは不要不要不要不要パターンパターンパターンパターンはははは不要不要不要不要??

PATTERN { ACTION }

{

if (PATTERN) {

ACTION;

}

}

Point!

• パターンは先頭になくてもプログラムを組めるんです

Page 5: Usptomonokai 20111028

gauc.no-ip.org

USP 友の会総会 (2011/10/28)

神神神神々々々々のののの言葉言葉言葉言葉神神神神々々々々のののの言葉言葉言葉言葉

•神は言っている「awk は使い捨てプログラムである」と

• We just wanted to have a very simple

scripting language that would allow us

<snip> to be able to write throw-away

programs for routine data processing.

(Prof. Aho)

Point!

• awk が真価を発揮するのは「一行野郎」

• AWKer はワンライナーとかライフライナーみたいな言葉は使ってはいけない

Japan GNU AWK Users' Club

Page 6: Usptomonokai 20111028

gauc.no-ip.org

USP 友の会総会 (2011/10/28)

PATTERN PATTERN だけだとどうなるだけだとどうなるだけだとどうなるだけだとどうなるだけだとどうなるだけだとどうなるだけだとどうなるだけだとどうなる??

• { ACTION } が省略された場合、{print $0} と

同じ扱いになる

Japan GNU AWK Users' Club

PATTERN PATTERN ってってってって一体何者一体何者一体何者一体何者ってってってって一体何者一体何者一体何者一体何者??

• PATTERN は「パターン」そのものではなく評価式で、

0 か空文字列以外は「真」になり、{print $0} が実

行される

Point!

• ちょっと便利な grep 程度?

Page 7: Usptomonokai 20111028

gauc.no-ip.org

USP 友の会総会 (2011/10/28)

神神神神々々々々のののの言葉言葉言葉言葉神神神神々々々々のののの言葉言葉言葉言葉

•神は言っている「awk は grep から産まれた」と。

• We were heavily influenced by GREP.

(Prof. Aho)

Japan GNU AWK Users' Club

Point!

• そんな装備で大丈夫か?

• 大丈夫。問題ない。

Page 8: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

正規表現正規表現正規表現正規表現へのへのへのへの正規表現正規表現正規表現正規表現へのへのへのへのマッチングマッチングマッチングマッチングマッチングマッチングマッチングマッチング ((grepgrep))

$0 ~ /RegExp/ {print $0}

Point!

• g/re/p の g と p は {print $0} と等価なので、まさに grep

$0 ~ /RegExp/

/RegExp/

Page 9: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

空行空行空行空行ととととスペーススペーススペーススペースだけのだけのだけのだけの行行行行をををを削除削除削除削除空行空行空行空行ととととスペーススペーススペーススペースだけのだけのだけのだけの行行行行をををを削除削除削除削除

length($0) > 0 && $0 !~ /^[ ¥t]+$/

{print $0}

length($0) > 0 && $0 !~ /^[ ¥t]+$/

length($0) && !/^[ ¥t]+$/

NF

Page 10: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

$0 $0 以外以外以外以外をををを表示表示表示表示するするするする場合場合場合場合はははは以外以外以外以外をををを表示表示表示表示するするするする場合場合場合場合はははは??

• AWK は破壊的に値が代入される

• 常に代入は「真」になる

• つまり $0 に欲しいものを代入すればいい

Page 11: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

$1 $1 をををを表示表示表示表示するするするするをををを表示表示表示表示するするするする

{print $1}

{$0 = $1; print $0}

$0 = $1

Page 12: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

置換置換置換置換だってできちゃうだってできちゃうだってできちゃうだってできちゃう置換置換置換置換だってできちゃうだってできちゃうだってできちゃうだってできちゃう

{sub(/RegExp/, "STR", $0); print $0}

sub(/RegExp/, "STR") || 4

Point!

• sub() の戻り値は置換された個数

• 1 だと l なのか | なのか I なのか分かりづらいので 4 が好まれるみたい

Page 13: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

区切区切区切区切区切区切区切区切 (OFS)(OFS) をををを表示表示表示表示するするするするをををを表示表示表示表示するするするする

BEGIN {OFS="¥t"} {print $1}

$ awk -v OFS="¥t"{$1 = $1; print $0}

$ awk -v OFS="¥t" '$1 = $1'

Point!

• これを「フィールドの再構成」といいます

Page 14: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

改行改行改行改行改行改行改行改行 (ORS) (ORS) をををを変更変更変更変更するにはするにはするにはするにはをををを変更変更変更変更するにはするにはするにはするには??

BEGIN {OFS = "¥n¥n"} {print $0}

BEGIN {OFS = "¥n¥n"} 4

Point!

• print $0 は printf("%sOFS", $0) なので、再構成が不要

ORS = "¥n¥n"

Page 15: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

みんなみんなみんなみんな大好大好大好大好ききききみんなみんなみんなみんな大好大好大好大好きききき FizzBuzzFizzBuzz

$ seq 100 | ¥

awk

'$0=($0%15)?($0%5)?($0%3)?$0:"Fizz":

"Buzz":"FizzBuzz"'

Page 16: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

head, tail head, tail はははははははは??

NR <= 10

headhead

$ tac | awk 'NR <= 10' | tac

tailtail

Point!

• そもそも awk で tail なんか作ってはいけない

• shell と awk を合わせて活用すべし

Page 17: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

まとめまとめまとめまとめまとめまとめまとめまとめ

• 資源の有効活用 (エコ活動)

• 頭の体操になる (ボケ防止)

• awk だけで記述できない (Shell の勉強もできる)

• さぁ、みんなも今日からアクションレス・プログラミングを

しよう!

Page 18: Usptomonokai 20111028

Japan GNU AWK Users' Club gauc.no-ip.org

USP 友の会総会 (2011/10/28)

最後最後最後最後にににに最後最後最後最後にににに

• 「日本 GNU AWK ユーザー会」は「USP 友の会」と友

好団体になります?

• Shell と awk の融合による無限の可能性に乞ご期

待?

• http://gauc.no-ip.org/gawk-users-jp/

Point!

• ただし「日本 GNU AWK ユーザー会」と契約しても魔法少女にはなれません