はじめに
テノヒラクルー、nikkieです。
昨日の小ネタの(まさかの)続編です。
uniq
コマンドも便利なことに気づきました。
目次
前回 & いただいたコメント
sort | uniq
がsort -u
と同じ動作と知ったことを記事にしました。
すると id:papiro さんからコメントをいただきました。ありがとうございます!
uniqコマンドですが、-c、-f、-u、-dとかのオプションは便利に使ってますね。
こちらに沿って手を動かし、知ったことをこの記事にまとめます。
この素振りにより、前回記事の「終わりに」の宿題も解消した感覚です。
逆にsort -uがある中で、uniq自体のユースケース(使い所)ってどんなものがあるんだろう?(宿題)
環境はmacOSのzshです(バージョンについては前回記事をどうぞ)。
% 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 | uniq
はsort -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