uniq コマンド 2015/09/25
連続して重複した行を1つにまとめるコマンド。
foo.txt
が以下の内容の場合、
$ cat foo.txt
3333
4444
1111
1111
3333
3333
4444
uniq
を使うと以下のようになる。
$ cat foo.txt | uniq
3333
4444
1111
3333
4444
連続していない離れた重複行も削除したければ、sort
コマンドコマンドで予めソートする必要がある。その代わり順番は保存されない。
$ cat foo.txt | sort | uniq
1111
3333
4444
インストール 2016/03/17
Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。
オプション 2016/05/10
-c
- 重複している行数を先頭に付加する。重複していない行は1になる。
-d
- 逆に重複している行のみを抽出する。2行以上同じ行が連続した場合にそれを1行のみ出力する。
-D
- 逆に重複している行のみを重複のまま抽出する。
-u
- 重複した行をまとめるのではなく削除してしまう。
--help
- ヘルプ表示
--version
- バージョン表示
--
というパラメータを渡すとそれ以降のパラメータをオプションではなくファイル名とみなしてくれるので、
-
で始まるファイル名を扱いたい場合に使うとよい。
-c
オプションの例
2015/09/25
-c
オプションは行数を各行の先頭に付けてくれる。自分の環境では各行がインデントされているがなぜだろう?
$ cat foo.txt
3333
4444
1111
1111
3333
3333
4444
$ cat foo.txt | uniq -c
1 3333
1 4444
2 1111
2 3333
1 4444
-d
, -D
オプションの例
2015/09/25
-d
オプションは重複していた行のみを出力する。-c
オプションで2以上になる行のみだ。重複行は1行にまとめられる。
-D
オプションは重複していた行を、重複したまま出力する。
$ cat foo.txt
3333
4444
1111
1111
3333
3333
4444
$ cat foo.txt | uniq -d
1111
3333
$ cat foo.txt | uniq -D
1111
1111
3333
3333
-u
オプションの例
2015/09/25
-u
オプションは -d
オプションとは逆に重複していない行のみを出力する。-c
オプションで1になる行のみだ。
$ cat foo.txt
3333
4444
1111
1111
3333
3333
4444
$ cat foo.txt | uniq -u
3333
4444
4444
HOWTO
日本語を含むファイルを処理するには 2014/09/16
漢字やひらがな/カタカナなどが含まれる日本語テキストは、うまくユニーク判定できない場合があるみたいで、その場合は環境変数 LC_ALL=C
または LANG=ja_JP.UTF-8
を設定するとよいみたい。
例
cat foo.txt | LC_ALL=C uniq
これはsort
コマンドでも事情が同じ。
重複している数の多い順にソートするには 2015/08/19
foo.txt
というファイルが以下の内容だったとして、
aaa
bbb
aaa
ccc
aaa
bbb
aaa
次のコマンドを実行すると
cat foo.txt | sort | uniq -c | sort -k1 -n -r
次のような結果が表示される。
4 aaa
2 bbb
1 ccc
sort
コマンドを2回使っている。
foo.txt
に日本語が含まれている場合は、以下のように LC_ALL=C
という環境変数を設定したほうがよい。
cat foo.txt | LC_ALL=C sort | LC_ALL=C uniq -c | sort -k1 -n -r