テキストを整形する

INPUT · スライド

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

01 / 06

`uniq` は「隣」しか見ない

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

```
~ $ uniq kudamono.txt
ringo
mikan
ringo
banana
mikan
ringo
```

何も消えていないね。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 と ringo
sort 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 サーバーを見る人が毎日やっている仕事だよ。