『シェル操作課題 (cut, sort, uniq などで集計を行う)設問編』に回答してみた

2012/07/28

シェル操作課題 (cut, sort, uniq などで集計を行う) 設問編 - Yamashiro0217の日記 に挑戦だ!!みんなもやろう!!

前提

$ sha1sum yamashiro.txt 
f53e812032b8689890aa7d48e1c6a3fd860d51fd  yamashiro.txt

を元ファイルとした。

問1 このファイルを表示しろ

$ cat yamashiro.txt
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

意地でも cat 以外でと言うならば

$ grep '' yamashiro.txt 
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

問2 このファイルからサーバー名とアクセス先だけ表示しろ

$ cut -d',' -f 1,4 yamashiro.txt 
server1,/video.php
server2,/profile.php
server3,/login.php
server1,/profile.php
server2,/profile.php
server2,/profile.php
server3,/login.php
server4,/video.php
server1,/video.php

awk(gawk)でできると思ったけど空白が入ってしまった

$ /bin/gawk -F',' '{print $1,",",$4}' yamashiro.txt 
server1 , /video.php
server2 , /profile.php
server3 , /login.php
server1 , /profile.php
server2 , /profile.php
server2 , /profile.php
server3 , /login.php
server4 , /video.php
server1 , /video.php

問3 このファイルからserver4の行だけ表示しろ

$ grep server4 yamashiro.txt 
server4,1343363225,12,/video.php

問4 このファイルの行数を表示しろ

$ wc -l yamashiro.txt |awk -F' ' '{print $1}'
9

単純に wc だけだとファイル名も出力されてしまった

$ wc -l yamashiro.txt 
9 yamashiro.txt

問5 このファイルをサーバー名、ユーザーIDの昇順で5行だけ表示しろ

あ、この問題間違えた!!(あとでなおす)

$ sort yamashiro.txt |head -n 5
server1,1343363105,8,/profile.php
server1,1343363124,30,/video.php
server1,1343363265,7,/video.php
server2,1343363110,20,/profile.php
server2,1343363110,20,/profile.php

sort -k の使い方。

http://anond.hatelabo.jp/20120727180525 参考になりました

問6 このファイルには重複行がある。重複行はまとめて数え行数を表示しろ

$ sort -u yamashiro.txt | wc -l
8

もしくは

$ sort yamashiro.txt | uniq | wc -l
8

sort -u いいよねー

問7 このログのUU(ユニークユーザー)数を表示しろ

$ awk -F',' '{print $3}' yamashiro.txt | sort -u  | wc -l
6

もしくは

$ cut -d',' -f 3 yamashiro.txt | sort -u | wc -l
6

かな。

問8 このログのアクセス先ごとにアクセス数を数え上位1つを表示しろ

$ awk -F',' '{print $4}' yamashiro.txt | sort | uniq -c | sort -nr |head -1
      4 /profile.php

sort | uniq -c | sort -nr は激アツ熟語と考えてる。 このあたりから想定期待結果と違う出力になってきた。 どうやら出題ファイルがちと違うみたい。

問9 このログのserverという文字列をxxxという文字列に変え、サーバー毎のアクセス数を表示しろ

$ awk -F',' '{print $1}' yamashiro.txt |sed -e 's/server/xxx/g' | sort | uniq -c | sort -nr
      3 xxx2
      3 xxx1
      2 xxx3
      1 xxx4

問10 このログのユーザーIDが10以上の人のユニークなユーザーIDをユーザーIDでソートして表示しろ

$ awk -F',' '{print $3}' yamashiro.txt | grep [0-9][0-9] | sort -u
12
20
30
35

grep [1-9][0-9] のがいいのかなーとか思ったけどUIDは0詰ないからいっか。