テキストを整形する

INPUT · スライド

重なりを消す、数える(`uniq`)

01 / 06

uniq は「隣」しか見ない

この回はいちばん引っかかりやすいところから始めるよ。

~ $ uniq kudamono.txtringomikanringobananamikanringo

何も消えていないね。ringo は3つあるのに。

uniq隣り合った行しか見ないからだよ。上から順に読んで、直前の行と同じなら捨てる。それだけなんだ。

ringo は3つあるけれど、あいだに mikan が挟まっているので「隣どうし」になっていないんだよ。

02 / 06

だから先に sort する

直し方は決まっているよ。先に並べて、同じものを隣に集めるんだ。

sort kudamono.txt | uniq

sortbananamikanmikanringoringoringo の順にしてくれるので、そこから uniq が隣の重なりを消せるようになる。

sort | uniq はセットとして覚えてしまおう。uniq を単独で使う場面はほとんど無いよ。

~ $ sort kudamono.txt | uniqbananamikanringo

03 / 06

-c で個数を数える

uniq のいちばんの値打ちがこれだよ。-c(count)を付けると、それぞれいくつあったかが出るんだ。

~ $ sort kudamono.txt | uniq -c      1 banana      2 mikan      3 ringo

sort -u では消すだけで数は出ない。数えられるのは uniq だけだよ。

これと sort -rn を組み合わせた3段が、集計の定番だったね。ログを読む仕事のほとんどはこの形で片が付くよ。

04 / 06

-d-u で選り分ける

uniq には逆向きの2つの旗があるよ。

  • -d(duplicate)… 2回以上あったものだけ出す
  • -u(unique)… 1回だけだったものだけ出す
sort kudamono.txt | uniq -d   # mikan と ringosort kudamono.txt | uniq -u   # banana だけ

使いどころがちゃんとあるよ。-d は「重複を見つける」(同じメールアドレスが2回登録されていないか)、-u は「1回しか出ていない珍しいものを探す」(たまにしか出ないエラー)だね。

05 / 06

sort -u との使い分け

前のレッスンで sort -u も重なりを消せると言ったよね。どちらを使えばいいんだろう。

やりたいこと書き方
重なりを消すだけsort -u
個数も知りたい`sort \uniq -c`
重複だけ見たい`sort \uniq -d`
1回だけのものを見たい`sort \uniq -u`

消すだけなら sort -u が短い。それ以外は uniq だよ。

-i を付けると大文字小文字を区別しないよ。Ringoringo を同じものとして数えたいときに使うんだ。

06 / 06

さあ、打ってみよう

ファイルは3つだよ。

  • kudamono.txt … 果物6行(ringo×3・mikan×2・banana×1)
  • access.log … 住所(IP アドレス)6行(192.168.0.1×3・10.0.0.5×2・192.168.0.2×1)
  • oomoji.txtRingoringomikan

access.log は本物のログを小さくしたものだと思ってね。「どの住所からいちばん来ているか」を数えるのは、Web サーバーを見る人が毎日やっている仕事だよ。