\r\n\r\n

linuxでのuniqコマンドの使い方

linuxuniq コマンドは、テキストファイルの中のユニークな行や重複する行を素早く見つけることができます。このガイドでは、その多機能性と特徴、そしてこの美しいユーティリティを最大限に活用する方法について説明します...

linuxuniq コマンドは、テキストファイルの中のユニークな行や重複する行を素早く見つけることができます。このガイドでは、その多機能性と特徴、そしてこの美しいユーティリティを最大限に活用する方法について説明します。

linuxでの一致するテキスト行の検索

uniqコマンドは高速で柔軟性があり、非常に優秀なコマンドです。しかし、多くのLinuxコマンドと同様に、理解さえすれば、いくつかの癖がある。知識がないままに購入すると、首をかしげるような結果になりかねません。これらのクセを指摘しながら、進めていきます。

uniqコマンドは、一つのことをきちんとやり遂げようとする、一途な人にぴったりです。そのため、パイプラインやコマンドパイプラインでの作業にも特に適しています。uniqは処理する入力をソートする必要があるため、最も頻繁に協力するのがsortです。

Let's light it up!

関連:Linuxでのパイプの使い方

uniqを実行するためのオプションがない

ロバート・ジョンソンの歌「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.txt

uniqに各行の先頭の3文字をスキップするように指示しても、同じ結果になる。

無視する場合

デフォルトでは、大文字と小文字を区別します。uniqは、同じ文字が大文字と小文字で現れる場合、異なる行とみなします。

例えば、以下のコマンドの出力を確認してみてください。

uniq -d -c sorted.txt | sort -rn

I 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を使いこなすには、どのツールが問題を解決してくれるのか、またそのツールはどこにあるのかを覚えておくことが大切なんだ。しかし、練習すれば大丈夫です。

また、「オタクになる方法」で検索していただければ、それに関する記事があるかもしれません。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ