【FreeBSD】uniqコマンドでキーを使った重複カットを行う
Contents
昨日のシェル芸ヴェンキョウカイ(問1、問5)で話題になった、BSD系環境のuniqコマンドの使い方について。
BSDのuniqにはキー部分を指定する「-w」オプションがないけどどうするの? っていう話です。
### テストデータ
問1;https://github.com/ryuichiueda/ShellGeiData/blob/master/vol.18/Q1/text
問5;https://github.com/ryuichiueda/ShellGeiData/blob/master/vol.18/Q5/text※問1の方のデータで解説します。
問5;https://github.com/ryuichiueda/ShellGeiData/blob/master/vol.18/Q5/text※問1の方のデータで解説します。
### 内容
#### 概要
問1の模範解答は
```sh
grep -e オトン -e オカン text | sort -u | uniq -w 3 -d
```となっています。
uniqの直前で止めると ```sh % grep -e オトン -e オカン text | sort -u 001 オトン 002 オカン 003 オカン 003 オトン 004 オカン 005 オトン ```となります。
このデータを先頭3文字の数字をキーにして、重複のある行を抜き出したい、というわけです。
uniqの直前で止めると ```sh % grep -e オトン -e オカン text | sort -u 001 オトン 002 オカン 003 オカン 003 オトン 004 オカン 005 オトン ```となります。
このデータを先頭3文字の数字をキーにして、重複のある行を抜き出したい、というわけです。
#### 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]]
```残念ですね。
#### そのほかのオプションで対応する
それっぽいオプションがいくつかあります。
>
−f num
比較する時に、各入力行の先頭から num 個のフィールドを無視します。 フィールドとは、空白文字で区切られた、空白以外の文字からなる文字 列です。 num を指定するときは、最初のフィールドを 1 として数えま す。
−s chars
比較する時に、各入力行の先頭から chars 文字を無視します。本オプ ションを −f オプションと一緒に指定した場合は、 num 個のフィールド に続く chars 文字が無視されます。 chars を指定するときは、最初の 文字を 1 として数えます。
どこかをキーにする、というオプションはありませんが、先頭から~~を無視する、というオプションはあるみたいです。……というわけで、左右を逆にして、先頭を無視する、という風にすれば対応できそうです。
また、「-s」オプションを使う場合はこうです。 ```sh % grep -e オトン -e オカン text | sort -u | awk '{print $2, $1}' | uniq -s 3 -d | awk '{print $2, $1}' 003 オカン ```
以上!
- 左右逆転
- 1フィールド目を無視
- もっかい左右逆転
また、「-s」オプションを使う場合はこうです。 ```sh % grep -e オトン -e オカン text | sort -u | awk '{print $2, $1}' | uniq -s 3 -d | awk '{print $2, $1}' 003 オカン ```
以上!
### 参考URL
英語、あんまり得意じゃないので日本語で読めるのはありがたし・・・