nikkie-ftnextの日記

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

sort | uniq にも使い所はあったのです! いただいたコメントを機にuniqのオプションを確認しました

はじめに

テノヒラクルー、nikkieです。

昨日の小ネタの(まさかの)続編です。
uniqコマンドも便利なことに気づきました。

目次

前回 & いただいたコメント

sort | uniqsort -uと同じ動作と知ったことを記事にしました。

すると id:papiro さんからコメントをいただきました。ありがとうございます!

uniqコマンドですが、-c、-f、-u、-dとかのオプションは便利に使ってますね。

こちらに沿って手を動かし、知ったことをこの記事にまとめます。
この素振りにより、前回記事の「終わりに」の宿題も解消した感覚です。

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

環境はmacOSzshです(バージョンについては前回記事をどうぞ)。

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

uniqのオプションを使ったsort | uniq

sort | uniq -c

-c, --count
Precede each output line with the count of the number of times the line occurred in the input, followed by a single space.

カウントできるのです! これは便利!

% sort girls.txt | uniq -c
   1 アキ
   2 こころ
   1 フウカ

こころちゃんが2回ですね🤗

sort | uniq -d

-d, --repeated
Output a single copy of each line that is repeated in the input.

重複している行だけを取り出せるのです!

% sort girls.txt | uniq -d
こころ

-cと組み合わせると、何回重複しているかが分かる!

% sort girls.txt | uniq -cd
   2 こころ

sort | uniq -u

-u, --unique
Only output lines that are not repeated in the input.

重複していない行だけを取り出します!

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

uniqのオプション、とっても便利〜!

uniq単体とオプション

-f num, --skip-fields num
Ignore the first num fields in each input line when doing comparisons.

スペース区切りの各行があったときに、先頭からいくつのフィールドを無視するか指定できます。

uniq -f検証用のファイルを用意。
(今回はsortの出力ではないので、重複行のこころを隣接させました)

% cat fields_girls.txt
1 こころ
2 こころ
3 アキ
4 フウカ

単にuniqでは出力はcatと変わりません。
「1 こころ」と「2 こころ」は別の文字列ですからね。

% uniq fields_girls.txt
1 こころ
2 こころ
3 アキ
4 フウカ

-fオプションで最初の(=1番目の)フィールドを無視するように指定します。
「1 こころ」と「2 こころ」は、最初のフィールド(1や2)を無視したら「こころ」が重複していますよね

% uniq -f 1 fields_girls.txt
1 こころ
3 アキ
4 フウカ

2行目が重複とみなされて消えました!

終わりに

uniqコマンドのオプションを確認しました。

  • sort | uniq -c:それぞれ何行あるかカウントできる
  • sort | uniq -d:重複している行だけを取り出せる
    • -cと併用するの便利そう
  • sort | uniq -u:重複していない行だけを取り出せる
  • uniq -f:指定した数だけフィールドを無視して重複を除ける

uniqのオプションを使わないsort | uniqsort -uと同じでしたが、オプションを使うことでsort | uniqじゃないとできないことがいっぱいありますね!
使い所を疑ってごめんよ、uniqコマンド🙏

今回はアウトプットする者に情報は集まるの好例だったと思います。
id:papiro さん、コメント誠にありがとうございました!

こぼれ話:uniq -fをGPT-4さんに聞いてみたところ

manを見てもuniq -fがピンとこなかったので、GPT-4で例を生成してみました。
プロンプトが悪かったのか、動作説明は普通に間違ってました

プロンプト

あなたはシェルスクリプトの経験が豊富なエンジニアです。入門者に対して例をまじえて回答してください

uniqコマンドについて教えてください

(manにある内容が日本語で読めます。※あんまり検証していません)

聞きたかった件

uniq -fをどんなときに使うか教えてください

参考に手を動かす

GPT-4さんが生成した例は

% cat file.txt
foo 1 2
bar 1 2
foo 3 4
bar 1 2

1行目と2行目の「1 2」は共通ですね。

% uniq -f 1 file.txt
foo 1 2
foo 3 4
bar 1 2

1行目と「1 2」が共通の2行目「bar 1 2」が除かれました!

GPT-4の誤答

普通に間違えたGPT-4さん。

foo 1 2
bar 1 2
foo 3 4

4行目「bar 1 2」を消していますが、隣接していないのでここは消えないですね。

プログラミングは得意だと認識していたのですが、こんな基本的なことで間違えるんですね〜(まじで聞き方が悪かったのかな?)

sort | uniq -f

このfile.txtはソートすると「1 2」の行が隣接するので

% sort file.txt
bar 1 2
bar 1 2
foo 1 2
foo 3 4

これをuniq -fに渡すとごっそり削れます。ぷよぷよ感...!

% sort file.txt | uniq -f 1
bar 1 2
foo 3 4