ヒント: uniqを使って、重複する行を削除する

textutilsを知ろう

多くの場合、重複する行があっても問題とならないのですが、ときどきそれが問題となることがあります。そういう問題が発生した場合、uniq コマンドの使い方を知っていれば、そのためのフィルターを作成するのに半日費やす必要は、まずありません。このツールを使って時間と手間を節約する方法を解説します。

Jacek Artymiak (jacek.artymiak@linuxworld.com), LinuxWorld columnist, LinuxWorld

Jacek Artymiak はフリーランスのコンサルタント兼ライターです。最新の著作としてStarOffice for Linux Bible (IDG Books Worldwide) およびInstall, Configure, and Customize Slackware Linux (PrimaTech) があります。また、家庭およびオフィスの Linux ユーザー向けの Linuxapprentice.com ニュースレターの発行者でもあります。連絡先はjacek.artymiak@linuxworld.com です。



2003年 4月 03日

並べ換えを行うと、重複している行が見つかることがあります。このような情報の重複は不要で、ディスク・スペースの節約のために削除してもかまわないときがあります。テキストは、並べ換えられている必要はありませんが、uniq は、読み出しを行いながら行を比較し、連続する2行以上を削除するだけであることに注意してください。以下の例は、このツールがどんな働きをするのかを示したものです。

リスト1. uniqを使って重複する行を削除する
$ cat happybirthday.txt
Happy Birthday to You!
Happy Birthday to You!
Happy Birthday Dear Tux!
Happy Birthday to You!

$ sort happybirthday.txt
Happy Birthday Dear Tux!
Happy Birthday to You!
Happy Birthday to You!
Happy Birthday to You!

$ sort happybirthday.txt | uniq
Happy Birthday Dear Tux!
Happy Birthday to You!

経理データなど重要なデータの入ったファイルでuniq などのツールを使って重複行を削除するのは危険ですので、警告しておきます。そういうファイルで行が重複しているのは、ほとんどが、同じ金額の別の取引を表している場合であり、それを削除すると、経理部でいろいろな問題を起こしてしまうことになります。絶対にそんなことを行ってはいけません。

もっと簡単に、1行しかない行 (unique lines) だけ、あるいは重複のある行 (duplicate lines) だけを表示させたい場合は、どうでしょうか。それには、以下のように、-u (unique) オプション、-d (duplicate) オプションを指定します。

リスト2. -uオプション、-dオプションの使い方
$ sort happybirthday.txt | uniq -u
Happy Birthday Dear Tux!

$ sort happybirthday.txt | uniq -d
Happy Birthday to You!

uniq-c オプションを添えると、統計を表示させることもできます。

リスト3. -cオプションの使い方
$ sort happybirthday.txt | uniq -uc
1 Happy Birthday Dear Tux!

$ sort happybirthday.txt | uniq -dc
3 Happy Birthday to You!

uniq が行全体を比較するものであっても便利なのでしょうが、このコマンドの機能は、それで終わりというわけではありません。とくに便利なのが、指定した数のフィールドを飛ばす機能で、それには、-f オプションに続けて飛ばしたいフィールドの数を指定します。これは、システム・ログを眺める場合に非常に役に立ちます。いくつかのエントリーが何度も重複しているというのはよくあることで、これがログを調べにくくしています。どのエントリーもタイムスタンプが違っていますので、ただ単にuniq を使っても用をなしません。しかし、時刻フィールドをすべて飛ばすように指定してやると、とたんに、ログは扱いやすくなります。uniq -f 3 /var/log/messages を試してみて、結果を自分で確認してみてください。

他に、-f と同じような働きで、指定した文字数だけ飛ばす-s オプションというのもあります。-f-s を組み合わせて使用することもできます。その場合、uniq は、まずフィールドを飛ばし、次に文字を飛ばします。逆に、指定した文字数だけで比較を行いたい場合はどうでしょうか。-w オプションを使ってみてください。

質問やご意見のある方は、ぜひお聞かせください。jacek@artymiak.com までメールをいただければ幸いです。

次回は、nl を取り上げる予定です。それでは、また。

参考文献

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=231476
ArticleTitle=ヒント: uniqを使って、重複する行を削除する
publish-date=04032003