Mais conteúdo relacionado
Awk勉強会用資料
- 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. 取り敢えず実行してみよう。
・ファイルの中身が全てそのまま表示される。
> 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
- 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
- 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はフィールド数が格納される。
- 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. 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;
}
- 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の時に実行されるわけではない事に注意。
- 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]