nikkie-ftnextの日記

イベントレポートや読書メモを発信

え! sort -u って sort | uniq と同じなの!?

はじめに

その必要はないわ。 nikkieです。

今回取り上げるのは小ネタです。
最近知ってえらく驚きました

目次

sortの-uオプション!?

『マスタリングLinuxシェルスクリプト 第2版』をパラパラ眺めていたnikkie氏。

[†4] 訳注:sortコマンドの-uオプションはソートを行ったうえで同じ内容の行を1行に集約して出力するオプションです。sort | uniqと同じ動作になります。(12.2.2より)

まじか、ずっとsort | uniqしてきたよ...

% cat girls.txt
こころ
アキ
こころ
フウカ
% sort girls.txt
アキ
こころ
こころ
フウカ
% sort girls.txt | uniq
アキ
こころ
フウカ
% sort -u girls.txt
アキ
こころ
フウカ

マニュアル確認

せっかくなので、マニュアルのうち今回のトピックに関係する箇所だけ確認しましょう。
macOSzshで確認しています。

% echo "$SHELL"
/bin/zsh
% /bin/zsh --version
zsh 5.8.1 (x86_64-apple-darwin21.0)

man uniq

Repeated lines in the input will not be detected if they are not adjacent, so it may be necessary to sort the files first.

uniqの前にsortが必要な理由が述べられています。
(意訳)入力の中の繰り返される行は、それらが隣接していない場合検出されない。
なので、最初にファイルの中身をソートするのが必要かもしれない

% uniq girls.txt
こころ
アキ
こころ
フウカ

man sort

-u, --unique
Unique keys.
Suppress all lines that have a key that is equal to an already processed one.

(意訳)すでに処理されたキーと等しいキーを持つ行すべてを抑制する

つまり、重複がなくなるということですね。

sort | uniq との出会い

出会いはLinuxの(かつての1)資格試験、LPIC レベル1のテキスト2です。
ここでsort | uniqを叩き込まれ、重複行のあるファイルに対して行数を出すシーンで活用してきました。
一例:JSONLinesからjqで特定フィールドの値を取り出して、取りうる値が何種類かを確認する

資格取得の上でも実務でもsort | uniqをそれ以外の方法がないものと思い込んで、しばしば使ってきました(常中)。
まさかsort -uでできたなんて!(教えてよ!テキストさん〜)

終わりに

sort | uniqを使っていたがsort -uでよかったという、最近の学び(衝撃的)を共有しました。

uniqにパイプする必要はないわ!
逆にsort -uがある中で、uniq自体のユースケース(使い所)ってどんなものがあるんだろう?(宿題)


  1. LinuCになったと、お噂はかねがね漏れ聞いております。https://linuc.org/