Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.
AWKでちょっとしたテキストを

処理する方法。
AWKとは?
・Alfred Aho/Peter Weinberger/Brain Kernighanによって
 作られたシンタックス駆動型のパターンマッチング言語。
!
・Alfred Ahoいわく「AWKは一般的なデータ処理用の短い

 プ...
AWKの(個人的に考える)メリット。
・最初からテキストファイルを行xカラムに分けられる。
!
・行に対してのパターンマッチングが行える。
!
・学習コストが低い。
こんなデータを使います。
NO DATE NAME VAL
1 2013/01/01 23:59:12 aaa 20
2 2013/04/05 12:10:09 bbb 42
3 2013/02/22 09:54:01 ccc 63
4 201...
取り敢えず実行してみよう。
・ファイルの中身が全てそのまま表示される。
> awk ‘{print $0}’ TestData.txt
NO DATE NAME VAL
1 2013/01/01 23:59:12 aaa 20
2 2013/0...
AWKの構造(1)
・awkは指定されたファイルの全ての行に命令文を繰り返す。
awk ‘{print $0}’ TestData.tsv
もう一度実行してみよう。
・今度はスペース区切り2カラム目と4カラム目が表示される。
・awkは自動的にスペース区切りでカラムを区切る。
・$iでiカラム目を選択可能。
・$0は全てのカラムという意味。
・上の文はTestData.txtの2カ...
AWKの構造(2)
awk ‘BEGIN{}{print $0}END{}’ TestData.tsv
FSとOFS。
・FSとOFSは特殊な変数。
・どちらも区切り文字を指定するもの。
・FSはインプットファイルの区切り文字。
・OFSはアウトプットファイルの区切り文字。
・デフォルトではどちらもスペースになっている。
tsvファイルを開いてみよう。
・BEGINの部分にFS= t を入れる事で今後行われる命令文は全て
 タブ区切りテキストを対象にしている事を伝えている。
・タブ区切りテキストもちゃんと指定したカラムが表示される。
・7枚目のスライドと結果が微...
tsvファイルをcsvファイルにしてみよう。
・BEGINの部分にOFS= , を入れる事で出力されるデータが
 カンマ区切りになる。
・ BEGIN{FS= t ;OFS= , }{print $0} ではどういう結果になるか試してみよう。
...
ここまでのまとめ
NRとNF。
> awk ‘BEGIN{FS= “t” }{print NR,NF,$0}’ TestData.tsv
1 4 NODATE NAME VAL
2 4 1 2013/01/01 23:59:12 aaa 20
3 4 2 201...
ここまでのまとめ(2)
AWKの構造(3)
・中括弧の前に条件式を置くことで中括弧の中の処理を行うか

 判別が出来る。
awk ‘EXPR{print $0}’
条件式 条件式が真なら実行される命令
条件式を使ってみよう(1)
・「4カラム目が20以下」の行を出力する。
・1行目と6行目は共に20以下なので出力される。
・それ以外の行は出力されない。
>awk ‘BEGIN{FS=” t” }$4 <= 20{print $0}’
1 20...
条件式を使ってみよう(2)
・ //で正規表現でのマッチングが可能。
・最初の式は「3カラム目にbが含まれている」行を出力。
・2番目の式は「3カラム目がcで終わっている」行を出力。
>awk ‘BEGIN{FS=” t” }$3 ~ /b/{...
条件式を使ってみよう(3)
・&&や¦¦で複数の条件を与えることも可能。
・最初の式は「3カラム目がcで終わっている」且つ「4カラム目が
 40より大きい」行を出力。
・2番目の式は「3カラム目がcで終わっている」或いは
 「4カラム目が20以...
条件式を使ってみよう(4)
・中括弧の数だけ処理が出来る。
・上の例では$4が偶数なら even という文字列と$4を出力。
・$4が奇数なら uneven という文字列と$4を出力。
>awk ‘BEGIN{FS=” t” }$4%2==0{...
まとめるとこんな感じ。
BEGIN{
print “script start”
}
EXPR1{
print “hoge1” $0
}
EXPR2{
print “hoge2” ,$0
}
{
print “all” ,$0
}
END{
pr...
AWKの構造(4)
awk -f test.awk TestData.tsv
・-fで命令文を書いたファイルを読みこませるとプログラムを
 外部ファイルにする事が出来る。
合計を求めてみよう。
・BEGINで変数を初期化、ENDで変数を出力。
・1行目はヘッダなので合計対象から外す。
sum.awk
> awk -f sum.awk TestData.tsv
275
if。
・sum.awkに条件をひとつ追加。1カラム目が奇数の時のみ
 合計対象とする。
if.awk
> awk -f if.awk TestData.tsv
104
for。
for(i=1;i<=10;i++){print i}
初期化式
継続条件式
再初期化式
・言わずと知れたループ構文。
・iに1を代入しループを開始する。
 iに1を加えながらiが10になるまでループを繰り返す。
for。
・個人的によく使うカラムチェックスクリプト。
・forで1カラム目からNカラム目までをナンバリングして
 1行ずつ出力する。
> awk -f for.awk TestData.tsv
1:1
2:2013/01/01 23:59:1...
split。
split(str,array,sep)
分割する文字列
分割した結果を格納する配列
区切り文字
・文字列を分割するための命令文。
・strに分割したい文字列を、arrayに格納したい配列を、
 sepに区切り文字を入れる。
split。
split.awk
> awk -f split.awk TestData.tsv
NO DATE TIME NAME VAL
1 2013/01/01 23:59:12 aaa 20
2 2013/04/05 12:10:09 ...
split。
・日時を日付と時間に分割するスクリプト。
・$2をスペースで分割してdatetimeに放り込む。
・datetime[n]でn番目の要素にアクセス可能。
 つまり日付はdatetime[1]、時間はdatetime[2]。
spl...
変数と配列
・変数はひとつの容れ物にひとつの値。
・配列はひとつの容れ物を幾つかに分けてラベルをつけて格納する。
val
array
※ちなみにAWKの配列は連想配列。インデックスは数値じゃなくてもOK。
条件式を使ってみよう(5)
nr.awk
> awk -f nr.awk TestData.tsv
2 2013/04/05 12:10:09 bbb 42
3 2013/02/22 09:54:01 ccc 63
4 2013/06/19 0...
条件式を使ってみよう(5)
・$5==20の2行目から$5==21の6行目までが出力される。
nr2.awk
> awk -f nr.awk TestData.tsv
1 2013/01/01 23:59:12 aaa 20
2 2013/04...
縦横置換スクリプト
transpose.awk
BEGIN{
FS="t";
OFS="t";
}
{
for(i=1;i<=NF;i++){
val[i, NR] = $i;
}
}
END{
for(i=1;i<=NF;i++){
for(...
縦横置換スクリプト読み解き
for(i=1;i<=NF;i++){
val[i, NR] = $i;
}
↓val[1,1] ↓val[2,1] ↓val[3,1] ↓val[4,1]
この for 文が何をしているか。
例えば今までと同様 T...
縦横置換スクリプト読み解き
for(i=1;i<=NF;i++){
val[i, NR] = $i;
}
最終的には横がフィールド、縦が行数の配列が出来上がる。
フィールド
行数
val
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=1...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=1...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=1...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=1...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=1...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=1...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=1...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=1...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=2...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=2...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=2...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=2...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=2...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=2...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=2...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=2...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=3...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=3...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=3...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=3...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=3...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=3...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=3...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=3...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=4...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=4...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=4...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=4...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=4...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=4...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=4...
縦横置換スクリプト読み解き
END{
for(i=1;i<=NF;i++){
for(j=1;j<=NR;j++){
printf("%st",val[i,j]);
}
print "";
}
出力部分のfor部分を読み解いていくと…
 i=4...
縦横置換スクリプト読み解き
■i=1 で出力される項目。
■i=2 で出力される項目。
■i=3 で出力される項目。
■i=4 で出力される項目。
Próxima SlideShare
Cargando en…5
×

Awk勉強会用資料

2.165 visualizaciones

Publicado el

  • Sé el primero en comentar

Awk勉強会用資料

  1. 1. AWKでちょっとしたテキストを
 処理する方法。
  2. 2. AWKとは? ・Alfred Aho/Peter Weinberger/Brain Kernighanによって  作られたシンタックス駆動型のパターンマッチング言語。 ! ・Alfred Ahoいわく「AWKは一般的なデータ処理用の短い
  プログラムを記述するために設計されたスクリプティング言語」 A W K ※O REILLY「言語設計者たちが考えること」より
  3. 3. AWKの(個人的に考える)メリット。 ・最初からテキストファイルを行xカラムに分けられる。 ! ・行に対してのパターンマッチングが行える。 ! ・学習コストが低い。
  4. 4. こんなデータを使います。 NO DATE NAME VAL 1 2013/01/01 23:59:12 aaa 20 2 2013/04/05 12:10:09 bbb 42 3 2013/02/22 09:54:01 ccc 63 4 2013/06/19 04:45:12 abc 120 5 2013/10/09 12:22:53 bbc 21 6 2013/03/23 20:12:23 zzz 9 ・スペース区切りのTestData.txt、タブ区切りのTestData.tsv
  5. 5. 取り敢えず実行してみよう。 ・ファイルの中身が全てそのまま表示される。 > awk ‘{print $0}’ TestData.txt NO DATE NAME VAL 1 2013/01/01 23:59:12 aaa 20 2 2013/04/05 12:10:09 bbb 42 3 2013/02/22 09:54:01 ccc 63 4 2013/06/19 04:45:12 abc 120 5 2013/10/09 12:22:53 bbc 21 6 2013/03/23 20:12:23 zzz 9
  6. 6. AWKの構造(1) ・awkは指定されたファイルの全ての行に命令文を繰り返す。 awk ‘{print $0}’ TestData.tsv
  7. 7. もう一度実行してみよう。 ・今度はスペース区切り2カラム目と4カラム目が表示される。 ・awkは自動的にスペース区切りでカラムを区切る。 ・$iでiカラム目を選択可能。 ・$0は全てのカラムという意味。 ・上の文はTestData.txtの2カラム目と4カラム目を表示するという命令を
  全行にわたって繰り返せという意味。 >awk ‘{print $2,$4}’ TestData.txt DATE VAL 2013/01/01 aaa 2013/04/05 bbb 2013/02/22 ccc 2013/06/19 abc 2013/10/09 bbc 2013/03/23 zzz
  8. 8. AWKの構造(2) awk ‘BEGIN{}{print $0}END{}’ TestData.tsv
  9. 9. FSとOFS。 ・FSとOFSは特殊な変数。 ・どちらも区切り文字を指定するもの。 ・FSはインプットファイルの区切り文字。 ・OFSはアウトプットファイルの区切り文字。 ・デフォルトではどちらもスペースになっている。
  10. 10. tsvファイルを開いてみよう。 ・BEGINの部分にFS= t を入れる事で今後行われる命令文は全て  タブ区切りテキストを対象にしている事を伝えている。 ・タブ区切りテキストもちゃんと指定したカラムが表示される。 ・7枚目のスライドと結果が微妙に違う事に注意。 > awk ‘BEGIN{FS= “t” }{print $2,$4}’ TestData.tsv DATE VAL 2013/01/01 23:59:12 20 2013/04/05 12:10:09 42 2013/02/22 09:54:01 63 2013/06/19 04:45:12 120 2013/10/09 12:22:53 21 2013/03/23 20:12:23 9
  11. 11. tsvファイルをcsvファイルにしてみよう。 ・BEGINの部分にOFS= , を入れる事で出力されるデータが  カンマ区切りになる。 ・ BEGIN{FS= t ;OFS= , }{print $0} ではどういう結果になるか試してみよう。 > awk ‘BEGIN{FS= “t” ;OFS= “,” }{print $1,$2,$3,$4}’ TestData.tsv > TestData.csv >cat TestData.csv NO,DATE,NAME,VAL 1,2013/01/01 23:59:12,aaa,20 2,2013/04/05 12:10:09,bbb,42 3,2013/02/22 09:54:01,ccc,63 4,2013/06/19 04:45:12,abc,120 5,2013/10/09 12:22:53,bbc,21 6,2013/03/23 20:12:23,zzz,9
  12. 12. ここまでのまとめ
  13. 13. NRとNF。 > awk ‘BEGIN{FS= “t” }{print NR,NF,$0}’ TestData.tsv 1 4 NODATE NAME VAL 2 4 1 2013/01/01 23:59:12 aaa 20 3 4 2 2013/04/05 12:10:09 bbb 42 4 4 3 2013/02/22 09:54:01 ccc 63 5 4 4 2013/06/19 04:45:12 abc 120 6 4 5 2013/10/09 12:22:53 bbc 21 7 4 6 2013/03/23 20:12:23 zzz 9 ・NRは行番号、NFはフィールド数が格納される。
  14. 14. ここまでのまとめ(2)
  15. 15. AWKの構造(3) ・中括弧の前に条件式を置くことで中括弧の中の処理を行うか
  判別が出来る。 awk ‘EXPR{print $0}’ 条件式 条件式が真なら実行される命令
  16. 16. 条件式を使ってみよう(1) ・「4カラム目が20以下」の行を出力する。 ・1行目と6行目は共に20以下なので出力される。 ・それ以外の行は出力されない。 >awk ‘BEGIN{FS=” t” }$4 <= 20{print $0}’ 1 2013/01/01 23:59:12 aaa 20 6 2013/03/23 20:12:23 zzz 9
  17. 17. 条件式を使ってみよう(2) ・ //で正規表現でのマッチングが可能。 ・最初の式は「3カラム目にbが含まれている」行を出力。 ・2番目の式は「3カラム目がcで終わっている」行を出力。 >awk ‘BEGIN{FS=” t” }$3 ~ /b/{print $0}’ 2 2013/04/05 12:10:09 bbb 42 4 2013/06/19 04:45:12 abc 120 5 2013/10/09 12:22:53 bbc 21 >awk ‘BEGIN{FS=” t” }$3 ~ /c$/{print $0}’ 3 2013/02/22 09:54:01 ccc 63 4 2013/06/19 04:45:12 abc 120 5 2013/10/09 12:22:53 bbc 21
  18. 18. 条件式を使ってみよう(3) ・&&や¦¦で複数の条件を与えることも可能。 ・最初の式は「3カラム目がcで終わっている」且つ「4カラム目が  40より大きい」行を出力。 ・2番目の式は「3カラム目がcで終わっている」或いは  「4カラム目が20以下」の行を出力。 >awk ‘BEGIN{FS=” t” }$3 ~ /c$/ && $4 > 40{print $0}’ 3 2013/02/22 09:54:01 ccc 63 4 2013/06/19 04:45:12 abc 120 >awk ‘BEGIN{FS=” t” }$3 ~ /c$/ || $4 <= 20{print $0}’ 1 2013/01/01 23:59:12 aaa 20 3 2013/02/22 09:54:01 ccc 63 4 2013/06/19 04:45:12 abc 120 5 2013/10/09 12:22:53 bbc 21 6 2013/03/23 20:12:23 zzz 9
  19. 19. 条件式を使ってみよう(4) ・中括弧の数だけ処理が出来る。 ・上の例では$4が偶数なら even という文字列と$4を出力。 ・$4が奇数なら uneven という文字列と$4を出力。 >awk ‘BEGIN{FS=” t” }$4%2==0{print “even” ,$4} $4%2==1{print “uneven” ,$4}’ even VAL even 20 even 42 uneven 63 even 120 uneven 21 uneven 9
  20. 20. まとめるとこんな感じ。 BEGIN{ print “script start” } EXPR1{ print “hoge1” $0 } EXPR2{ print “hoge2” ,$0 } { print “all” ,$0 } END{ print “script end” } 行が読まれる前に実行される。 EXPR1 が真なら実行される。 EXPR2 が真なら実行される。 全ての行で実行される。 全ての行が読み終わったら実行される。
  21. 21. AWKの構造(4) awk -f test.awk TestData.tsv ・-fで命令文を書いたファイルを読みこませるとプログラムを  外部ファイルにする事が出来る。
  22. 22. 合計を求めてみよう。 ・BEGINで変数を初期化、ENDで変数を出力。 ・1行目はヘッダなので合計対象から外す。 sum.awk > awk -f sum.awk TestData.tsv 275
  23. 23. if。 ・sum.awkに条件をひとつ追加。1カラム目が奇数の時のみ  合計対象とする。 if.awk > awk -f if.awk TestData.tsv 104
  24. 24. for。 for(i=1;i<=10;i++){print i} 初期化式 継続条件式 再初期化式 ・言わずと知れたループ構文。 ・iに1を代入しループを開始する。  iに1を加えながらiが10になるまでループを繰り返す。
  25. 25. for。 ・個人的によく使うカラムチェックスクリプト。 ・forで1カラム目からNカラム目までをナンバリングして  1行ずつ出力する。 > awk -f for.awk TestData.tsv 1:1 2:2013/01/01 23:59:12 3:aaa 4:20 for.awk
  26. 26. split。 split(str,array,sep) 分割する文字列 分割した結果を格納する配列 区切り文字 ・文字列を分割するための命令文。 ・strに分割したい文字列を、arrayに格納したい配列を、  sepに区切り文字を入れる。
  27. 27. split。 split.awk > awk -f split.awk TestData.tsv NO DATE TIME NAME VAL 1 2013/01/01 23:59:12 aaa 20 2 2013/04/05 12:10:09 bbb 42 3 2013/02/22 09:54:01 ccc 63 4 2013/06/19 04:45:12 abc 120 5 2013/10/09 12:22:53 bbc 21 6 2013/03/23 20:12:23 zzz 9 BEGIN{ FS="t"; OFS="t"; } NR == 1{ print $1,$2,"TIME",$3,$4; next; } { split($2,datetime," "); print $1,datetime[1],datetime[2],$3,$4; }
  28. 28. split。 ・日時を日付と時間に分割するスクリプト。 ・$2をスペースで分割してdatetimeに放り込む。 ・datetime[n]でn番目の要素にアクセス可能。  つまり日付はdatetime[1]、時間はdatetime[2]。 split.awk BEGIN{ FS="t"; OFS="t"; } NR == 1{ print $1,$2,"TIME",$3,$4; next; } { split($2,datetime," "); print $1,datetime[1],datetime[2],$3,$4; }
  29. 29. 変数と配列 ・変数はひとつの容れ物にひとつの値。 ・配列はひとつの容れ物を幾つかに分けてラベルをつけて格納する。 val array ※ちなみにAWKの配列は連想配列。インデックスは数値じゃなくてもOK。
  30. 30. 条件式を使ってみよう(5) nr.awk > awk -f nr.awk TestData.tsv 2 2013/04/05 12:10:09 bbb 42 3 2013/02/22 09:54:01 ccc 63 4 2013/06/19 04:45:12 abc 120 5 2013/10/09 12:22:53 bbc 21 $1==2,$1==5{ print $0 } ・条件式をカンマで2つ並べると最初の式が成り立ってから  2番目の式が成り立つまでを実行する。 ・上の例だと$1==2がなりたつ3行目から$1==5がなりたつ6行目  までを実行する。 ・$1が2,3,4,5の時に実行されるわけではない事に注意。
  31. 31. 条件式を使ってみよう(5) ・$5==20の2行目から$5==21の6行目までが出力される。 nr2.awk > awk -f nr.awk TestData.tsv 1 2013/01/01 23:59:12 aaa 20 2 2013/04/05 12:10:09 bbb 42 3 2013/02/22 09:54:01 ccc 63 4 2013/06/19 04:45:12 abc 120 5 2013/10/09 12:22:53 bbc 21 BEGIN{ FS="t"; OFS="t"; } $4==20,$4==21{ print $0 }
  32. 32. 縦横置換スクリプト transpose.awk BEGIN{ FS="t"; OFS="t"; } { for(i=1;i<=NF;i++){ val[i, NR] = $i; } } END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } }
  33. 33. 縦横置換スクリプト読み解き for(i=1;i<=NF;i++){ val[i, NR] = $i; } ↓val[1,1] ↓val[2,1] ↓val[3,1] ↓val[4,1] この for 文が何をしているか。 例えば今までと同様 TestData.tsv に対して実行してみると…。 データの最初の 1 行目は配列 val に以下の様に格納される。 2 行目はこんな感じに格納される。 ↓val[1,2] ↓val[2,2] ↓val[3,2] ↓val[4,2]
  34. 34. 縦横置換スクリプト読み解き for(i=1;i<=NF;i++){ val[i, NR] = $i; } 最終的には横がフィールド、縦が行数の配列が出来上がる。 フィールド 行数 val
  35. 35. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=1/j=1の時。
  36. 36. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=1/j=2の時。
  37. 37. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=1/j=3の時。
  38. 38. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=1/j=4の時。
  39. 39. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=1/j=5の時。
  40. 40. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=1/j=6の時。
  41. 41. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=1/j=7の時。
  42. 42. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=1の中のjのループが終わったのでprint “”で改行を行う。
  43. 43. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=2/j=1の時。
  44. 44. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=2/j=2の時。
  45. 45. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=2/j=3の時。
  46. 46. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=2/j=4の時。
  47. 47. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=2/j=5の時。
  48. 48. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=2/j=6の時。
  49. 49. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=2/j=7の時。
  50. 50. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=2の中のjのループが終わったのでprint “”で改行を行う。
  51. 51. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=3/j=1の時。
  52. 52. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=3/j=2の時。
  53. 53. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=3/j=3の時。
  54. 54. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=3/j=4の時。
  55. 55. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=3/j=5の時。
  56. 56. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=3/j=6の時。
  57. 57. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=3/j=7の時。
  58. 58. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=3の中のjのループが終わったのでprint “”で改行を行う。
  59. 59. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=4/j=1の時。
  60. 60. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=4/j=2の時。
  61. 61. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=4/j=3の時。
  62. 62. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=4/j=4の時。
  63. 63. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=4/j=5の時。
  64. 64. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=4/j=6の時。
  65. 65. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=4/j=7の時。
  66. 66. 縦横置換スクリプト読み解き END{ for(i=1;i<=NF;i++){ for(j=1;j<=NR;j++){ printf("%st",val[i,j]); } print ""; } 出力部分のfor部分を読み解いていくと…  i=4の中のjのループが終わったのでprint “”で改行を行う。
  67. 67. 縦横置換スクリプト読み解き ■i=1 で出力される項目。 ■i=2 で出力される項目。 ■i=3 で出力される項目。 ■i=4 で出力される項目。

×