awkの勉強をしていると、シェル操作課題 (cut, sort, uniq などで集計を行う) 設問編を見つけたので出来るだけawkを使って解いてみた。
問題ファイル
server1,1343363124,30,/video.php
server2,1343363110,20,/profile.php
server3,1343363115,7,/login.php
server1,1343363105,8,/profile.php
server2,1343363205,35,/profile.php
server2,1343363110,20,/profile.php
server3,1343363205,30,/login.php
server4,1343363225,12,/video.php
server1,1343363265,7,/video.php
問1 このファイルを表示しろ
想定期待結果:
ファイル全体の表示
$ awk '{print}' sample
問2 このファイルからサーバー名とアクセス先だけ表示しろ
想定期待結果:
server1,/video.php
server2,/profile.php
server2,/login.php
server1,/profile.php
server2,/profile.php
server2,/profile.php
server3,/login.php
server4,/video.php
server1,/video.php
$ awk -F '[,]' '{print $1, $4}' sample
問3 このファイルからserver4の行だけ表示しろ
想定期待結果:
server4,1343363225,12,/video.php
$ awk '/server4/' sample
問4 このファイルの行数を表示しろ
想定期待結果:
9
$ awk '{print}' sample | wc -l
問5 このファイルをサーバー名、ユーザーIDの昇順で5行だけ表示しろ
想定期待結果:
server1,1343363265,7,/video.php
server1,1343363105,8,/profile.php
server1,1343363124,30,/video.php
server2,1343363110,20,/profile.php
server2,1343363110,20,/profile.php
$ sort -k1,1 -k3,3n -t"," sample | awk 'NR<6'
問6 このファイルには重複行がある。重複行はまとめて数え行数を表示しろ
想定期待結果:
8
補足:
hoge,30
foo,20
hoge,30
だったら2行と数える。
$ awk '{a[$0]=$0} END {print length(a)}' sample
問7 このログのUU(ユニークユーザー)数を表示しろ
想定期待結果: 6
$ awk -F'[,]' '{print $3}' sample | sort | uniq | wc -l
$ awk -F'[,]' '{print $3}' sample | awk '{a[$0] = $0} END {print length(a)}'
問8 このログのアクセス先ごとにアクセス数を数え上位1つを表示しろ
想定期待結果: 4 /profile.php
$ awk -F'[,]' '{print $4}' sample | sort | uniq -c | sort -rn | head -1
問9 このログのserverという文字列をxxxという文字列に変え、サーバー毎のアクセス数を表示しろ
想定期待結果:
3 xxx1
3 xxx2
2 xxx3
1 xxx4
$ awk -F'[,]' '{print $1}' sample | awk 'sub(/server/,"xxx")' | sort | uniq -c
問10 このログのユーザーIDが10以上の人のユニークなユーザーIDをユーザーIDでソートして表示しろ
想定期待結果:
12
20
30
35
$ awk -F'[,]' '{print $3}' sample | awk '$0>10 {print}' | sort | uniq