\r\n\r\n
linuxuniq コマンドは、テキストファイルの中のユニークな行や重複する行を素早く見つけることができます。このガイドでは、その多機能性と特徴、そしてこの美しいユーティリティを最大限に活用する方法について説明します。
uniqコマンドは高速で柔軟性があり、非常に優秀なコマンドです。しかし、多くのLinuxコマンドと同様に、理解さえすれば、いくつかの癖がある。知識がないままに購入すると、首をかしげるような結果になりかねません。これらのクセを指摘しながら、進めていきます。
uniqコマンドは、一つのことをきちんとやり遂げようとする、一途な人にぴったりです。そのため、パイプラインやコマンドパイプラインでの作業にも特に適しています。uniqは処理する入力をソートする必要があるため、最も頻繁に協力するのがsortです。
Let's light it up!
関連:Linuxでのパイプの使い方
ロバート・ジョンソンの歌「I believe I'll clean my broom」の歌詞が書かれたテキストファイルがあります。uniqはどうなのか見てみましょう。
以下のように入力し、内容の少ない出力を取り込むことにします。
uniq dust-my-broom.txt | less繰り返されるセリフも含めて、曲の全体像をより短時間で得ることができるのです。
これは、唯一の線でもなければ、繰り返しの線でもないようだ。
そう、それが最初のクセだからです。オプションなしでuniqを実行すると、-u(ユニークライン)オプションが使用されたかのように動作します。これは、ファイル中のユニークな行だけを表示するように uniq に指示します。重複行が見えるのは、uniqが重複行として扱うには、その重複行に隣接していなければならないからで、sortはそのためのものです。
ファイルをソートすると、重複している行がグループ化され、uniqはそれらを重複として扱います。ファイルに対してsortを使い、ソートされた出力をuniqにインポートし、最終的な出力をlessにインポートする予定です。
そのために、次のように入力します。
sort dust-my-broom.txt | uniq | lessソートされた行のリストが縮小表示されます。
というセリフは、この曲の中で複数回登場したはずで、実際、この曲の最初の4行の中で2回繰り返されている。
では、なぜユニークなセリフが連発されるのでしょうか。なぜなら、行はファイルに最初に現れたときに一意であり、それ以降の項目だけが繰り返されるからである。これは、各ユニークラインの最初のマッチをリストアップしていると考えることができます。
もう一度sortを使って、出力を新しいファイルにリダイレクトしてみましょう。そうすれば、すべてのコマンドでsortを使う必要はありません。
次のようなコマンドを入力します。
sort dust-my-broom.txt > sorted.txtこれで、あらかじめソートされたファイルができあがりました。
c (count) オプションを使用すると、ファイル内の各行の出現回数を表示することができます。
次のコマンドを入力します。
uniq -c sorted.txt | lessしかし、最初の行は空であることに気づくだろう。これは、ファイル中に5つの空行があることを意味する。
もし、出力を数値順にソートしたい場合は、uniq の出力を sort にインポートすることができる。この例では、-r (reverse) と -n (numeric sort) オプションを使い、結果を less にインポートする。
以下のように入力します。
uniq -c sorted.txt | sort -rn | lessリストは、各行の出現頻度に応じて降順にソートされます。
ファイル中の重複した行だけを見たい場合は、-d(repeated)オプションを使用します。ファイル内で何度コピーされても、1行を1回だけリストアップします。
このオプションを使用するには、次のように入力します。
uniq -d sorted.txt重複している行をリストアップします。上部に空白行があることに気づくだろうが、これはファイルに空白行が重複して含まれていることを意味し、UNIQがリストを装飾するために残したスペースではない。
また、-d (repeat) と -c (count) オプションを組み合わせて、ソートしてパイプ出力することも可能です。これにより、少なくとも2つのオカレンスを持つソートされたカラムが得られます。
このオプションを使用するには、次のように入力します。
uniq -d -c sorted.txt | sort -rn重複している各行のリストと、その行がファイルに現れるたびにエントリーを表示するには、-D (all duplicate lines) オプションを使用します。
このオプションを使用するには、次のように入力します。
uniq -D sorted.txt | lessリストには、重複した行ごとに1つのエントリーが含まれます。
グループ化された行は、各グループの前(prepend)か後(append)、または各グループの前と後(両方)に表示されます。
モディファイアとしてappendを使うので、次のように入力します。
uniq --group=append sorted.txt | lessグループは空白行で区切られ、見やすくなっています。
デフォルトでは、uniqは各行の全長をチェックします。ただし、チェックを特定の文字数に制限したい場合は、-w (check chars) オプションを使用することができます。
この例では、前のコマンドを繰り返して、比較を最初の3文字に限定することにします。
uniq -w 3 --group=append sorted.txt | lessグループ分けとは全く違う結果が返ってきます。
ib "で始まる行はすべて、その部分が同じであるため、重複しているとみなしてグループ化しています。
同様に、"I'm "で始まる行は、残りの部分が異なっていても、すべて重複行とみなされます。
ファイルの行番号をつけるときなど、行頭の文字を一定数スキップさせると便利な場合があります。あるいは、uniqがタイムスタンプをスキップして、1文字目の行ではなく、6文字目の行のチェックを開始する必要があるとします。
以下は、ソートされたファイルに行番号をつけたバージョンです。
uniqに3文字目から比較チェックを開始させたい場合は、-s(skip character)オプションを使って、次のように入力します。
uniq -s 3 -d -c numbered.txtなお、表示される行番号は、各重複項目が最初に表示される行番号です。
また、文字の代わりにフィールド(一連の文字といくつかの空白)をスキップすることもできます。ここでは、-f(fields)オプションを使って、uniqに無視するフィールドを指示します。
uniqに最初のフィールドを無視させるために、次のようなコマンドを入力します。
uniq -f 1 -d -c numbered.txtuniqに各行の先頭の3文字をスキップするように指示しても、同じ結果になる。
デフォルトでは、大文字と小文字を区別します。uniqは、同じ文字が大文字と小文字で現れる場合、異なる行とみなします。
例えば、以下のコマンドの出力を確認してみてください。
uniq -d -c sorted.txt | sort -rnI believe I will dust my broom」と「I believe I will dust my broom」のセリフは、「believe」の「B」があるため、重複とみなされない。信じる」の場合は別
i (ignore case) オプションを付けると、これらの行は重複して扱われます。
uniq -d -c -i sorted.txt | sort -rn行が重複しているものとして扱われ、グループ化されるようになりました。
Linux は多くの特別なユーティリティを提供しています。その多くと同様に、uniq は毎日使うようなツールではありません。
だから、Linuxを使いこなすには、どのツールが問題を解決してくれるのか、またそのツールはどこにあるのかを覚えておくことが大切なんだ。しかし、練習すれば大丈夫です。
また、「オタクになる方法」で検索していただければ、それに関する記事があるかもしれません。