Linuxコンソール上で、ソートせずにユニークな値を取得したい時がある。
例えば、以下のようなファイルからユニークな値を取得する際、よく使われる方法としてはsort+uniqコマンドの組み合わせなのだが、それだと順番がずれてしまう。
あくまでもその文字列が最初に登場した順番でユニークな値を取得したいとする。

shell
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.txt test:0 test:2 test:6 test:9 test:4 test:9 test:9 test:9 test:4 test:0 test:2 test:8 test:0 test:7 test:0 [root@BS-PUB-CENT7-01 ~]# cat /tmp/test.txt | sort | uniq test:0 test:2 test:4 test:6 test:7 test:8 test:9

そんな時は、以下の方法がある。

1.awkで取得する

前にこちらでも触れたことがあるが、awkで以下のようにコマンドを実行することで、同じ文字列が2回目の場合は出力させないようにできる。

bash
コマンド | awk '!a[$1]++'
shell
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.txt | awk '!a[$1]++' test:0 test:2 test:6 test:9 test:4 test:8 test:7

2.Perlで取得する

awkと同じように、Perlでも同様の処理が行える。

bash
コマンド | perl -ne 'print unless $seen{$_}++'
shell
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.txt | perl -ne 'print unless $seen{$_}++' test:0 test:2 test:6 test:9 test:4 test:8 test:7

3.johnパッケージのuniqueコマンドを利用する

変わり種としては、脆弱性スキャンを行うツールであるjohnパッケージ(John the Ripper)の中にあるuniqueコマンドが同じような動作をする(ただし、一度違うファイルに書き出す必要があるようだ)。

bash
コマンド | unique 出力先PATH
shell
blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test.txt | unique /tmp/test.txt.uniq blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test.txt.uniq test:0 test:2 test:6 test:9 test:4 test:8 test:7