昨日のシェル芸ヴェンキョウカイ(問1、問5)で話題になった、BSD系環境のuniqコマンドの使い方について。
BSDのuniqにはキー部分を指定する「-w」オプションがないけどどうするの? っていう話です。

### 内容
#### 概要 問1の模範解答は ```sh grep -e オトン -e オカン text | sort -u | uniq -w 3 -d
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
uniqの直前で止めると
```sh
% grep -e オトン -e オカン text | sort -u
001 オトン
002 オカン
003 オカン
003 オトン
004 オカン
005 オトン

```となります。<br/>
このデータを先頭3文字の数字をキーにして、重複のある行を抜き出したい、というわけです。<br/>
<br/>


</div>
<div class="section">
    #### uniqの使われどころ
    ここで、『先頭3文字の数字をキーにして』ということのために、「uniq -w 3 -d」の「-w 3」オプションが使用されています。

    >
         -w, --check-chars=number 判断の終了文字数を指定する。指定しない場合は行末とする

    
つまり、先頭から3文字をuniqのキーにする、という意味です。……しかしながら、FreeBSD(たぶんMacも)のuniqには「-w」オプションがありません。
```sh
% grep -e オトン -e オカン text | sort -u | uniq -w 3 -d
uniq: illegal option -- w
usage: uniq [-c | -d | -u] [-i] [-f fields] [-s chars] [input [output]]

```残念ですね。<br/>
<br/>


</div>
<div class="section">
    #### そのほかのオプションで対応する
    それっぽいオプションがいくつかあります。

    >
         −f num
比較する時に、各入力行の先頭から num 個のフィールドを無視します。 フィールドとは、空白文字で区切られた、空白以外の文字からなる文字 列です。 num を指定するときは、最初のフィールドを 1 として数えま す。
  
 −s chars
比較する時に、各入力行の先頭から chars 文字を無視します。本オプ ションを −f オプションと一緒に指定した場合は、 num 個のフィールド に続く chars 文字が無視されます。 chars を指定するときは、最初の 文字を 1 として数えます。

    
どこかをキーにする、というオプションはありませんが、先頭から~~を無視する、というオプションはあるみたいです。……というわけで、左右を逆にして、先頭を無視する、という風にすれば対応できそうです。

<ul>
<li>左右逆転</li>
</ul>```sh
% grep -e オトン -e オカン text | sort -u | awk &#39;{print $2, $1}&#39;
オトン 001
オカン 002
オカン 003
オトン 003
オカン 004
オトン 005

  • 1フィールド目を無視
```sh % grep -e オトン -e オカン text | sort -u | awk '{print $2, $1}' | uniq -f 1 -d オカン 003
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<ul>
<li>もっかい左右逆転</li>
</ul>```sh
% grep -e オトン -e オカン text | sort -u | awk &#39;{print $2, $1}&#39; | uniq -f 1 -d | awk &#39;{print $2, $1}&#39;
003 オカン

```できあがり!<br/>
また、「-s」オプションを使う場合はこうです。
```sh
% grep -e オトン -e オカン text | sort -u | awk &#39;{print $2, $1}&#39; | uniq -s 3 -d | awk &#39;{print $2, $1}&#39;
003 オカン

```<br/>
以上!<br/>
<br/>


</div>
</div>
<div class="section">
    ### 参考URL
    
<ul>
<li><a href="http://kaworu.jpn.org/doc/FreeBSD/jman/man1/uniq.1.php">uniq(1) FreeBSDドキュメントJMan</a></li>
<li><a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230918/">Linuxコマンド集 - 【 uniq 】 ソート済みのファイルから重複した行を削除する:ITpro</a></li>
</ul>英語、あんまり得意じゃないので日本語で読めるのはありがたし・・・

</div>