Linux の重複フィルタリング

LinuxLinuxBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Linux 重複フィルタリング実験へようこそ。この実験では、Linux の uniq コマンドの使い方を学びます。このコマンドは、テキストファイル内の重複データをフィルタリングするための重要なツールです。このコマンドは、ログファイルの操作、データ処理タスク、およびテキスト操作を行う際に特に有用です。

この実験の目的は、ファイルから重複行を効果的に識別して削除する方法を教えることです。あなたは、uniq コマンドを単独で使用する方法と、sort などの他のコマンドと組み合わせて、より強力なフィルタリング機能を実現する方法を学びます。これらのスキルは、システム管理者、データアナリスト、および Linux 環境でテキストデータを処理する必要のあるすべての人にとって基本的なものです。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/BasicFileOperationsGroup -.-> linux/cut("Text Cutting") linux/TextProcessingGroup -.-> linux/sort("Text Sorting") linux/TextProcessingGroup -.-> linux/uniq("Duplicate Filtering") subgraph Lab Skills linux/echo -.-> lab-271417{{"Linux の重複フィルタリング"}} linux/cat -.-> lab-271417{{"Linux の重複フィルタリング"}} linux/cut -.-> lab-271417{{"Linux の重複フィルタリング"}} linux/sort -.-> lab-271417{{"Linux の重複フィルタリング"}} linux/uniq -.-> lab-271417{{"Linux の重複フィルタリング"}} end

uniq コマンドの理解

このステップでは、テキストファイル内の重複行をフィルタリングするために使用される uniq コマンドの基本を学びます。uniq コマンドは、ログ、設定ファイル、および重複を識別または削除する必要があるその他のデータを扱う際に特に重要です。

まず、操作対象のサンプルテキストファイルを作成しましょう。~/project ディレクトリに duel_log.txt という名前のファイルを作成します。

echo -e "sword\nsword\nshield\npotion\npotion\nshield" > ~/project/duel_log.txt

このコマンドは、以下の内容を持つファイルを作成します。

sword
sword
shield
potion
potion
shield

このファイルには重複行があることに注意してください。「sword」が 2 回、「potion」が 2 回、「shield」が 2 回(ただし連続していない)出現しています。

では、uniq コマンドを使用して隣接する重複行をフィルタリングしましょう。

uniq ~/project/duel_log.txt

以下の出力が表示されるはずです。

sword
shield
potion
shield

ここで興味深いことに、uniq コマンドは 2 番目の「sword」と 2 番目の「potion」を削除しました。なぜなら、これらは隣接する重複行だったからです。しかし、「shield」はまだ 2 回出現しています。なぜなら、その重複行は互いに隣接していなかったからです。

これは理解すべき重要な概念です。uniq コマンドは、互いに隣接する重複行(連続する重複行)のみを削除します。同じ内容がファイル内の他の場所に出現していても、その重複行と隣接していない場合、uniq はそれをフィルタリングしません。

この動作を確認するために、元のファイルを再度確認しましょう。

cat ~/project/duel_log.txt

これを uniq コマンドの出力と比較すると、隣接する重複行のみが削除されたことが明確にわかります。

完全な重複削除のための sortuniq の組み合わせ

前のステップでは、uniq コマンドが隣接する重複行のみを削除することを学びました。しかし、多くの実際のシナリオでは、ファイル内の位置に関係なくすべての重複を削除する必要があります。これを実現するには、sort コマンドと uniq コマンドを組み合わせることができます。

sort コマンドは、行をアルファベット順または数値順に並べます。これにより、重複行がまとまります。ソート後、すべての重複行が隣接するため、uniq コマンドがすべての重複を効果的に削除できるようになります。

まず、結果を保存する新しいファイルを作成しましょう。

touch ~/project/sorted_duel_log.txt

では、sort コマンドを使用して、元のファイルの行をアルファベット順に並べましょう。

sort ~/project/duel_log.txt

以下の出力が表示されるはずです。

potion
potion
shield
shield
sword
sword

sort コマンドがすべての重複行をまとめたことに注意してください。では、このソートされた出力を uniq コマンドにパイプして、重複を削除しましょう。

sort ~/project/duel_log.txt | uniq

出力は以下のようになるはずです。

potion
shield
sword

完璧です!これですべての重複が削除されたリストができました。この出力を sorted_duel_log.txt ファイルに保存しましょう。

sort ~/project/duel_log.txt | uniq > ~/project/sorted_duel_log.txt

新しいファイルの内容を確認しましょう。

cat ~/project/sorted_duel_log.txt

以下の内容が表示されるはずです。

potion
shield
sword

この sortuniq の組み合わせは、Linux でのデータ処理における強力な手法です。これにより、ファイル内のすべての重複エントリを効率的に見つけて削除でき、データのクリーニングや分析タスクに不可欠です。

uniq の高度なオプションと実用的なアプリケーション

これまでに uniq の基本的な使い方と sort との組み合わせ方を学びました。次に、uniq コマンドの追加オプションをいくつか見ていきましょう。これらのオプションにより、uniq はデータ処理タスクでさらに強力なツールになります。

-c で出現回数をカウントする

-c オプションは、各行の出現回数をカウントします。ファイル内の各一意の行が何回出現するかを知りたい場合に便利です。

sort ~/project/duel_log.txt | uniq -c

以下のような出力が表示されるはずです。

      2 potion
      2 shield
      2 sword

これは、元のファイル内で各項目が 2 回出現していることを示しています。

-d で重複行のみを見つける

重複行(2 回以上出現する行)のみを見つけたい場合は、-d オプションを使用できます。

sort ~/project/duel_log.txt | uniq -d

出力:

potion
shield
sword

ファイル内のすべての項目に重複があるため、出力にはすべての項目がリストされています。

一意のエントリのみを含むファイルを作成する

uniq コマンドをよりよく説明するために、もっと多様な内容を持つ新しいファイルを作成しましょう。

echo -e "apple\napple\napple\nbanana\ncherry\ncherry\ngrape" > ~/project/fruits.txt

このファイルを確認しましょう。

cat ~/project/fruits.txt

出力:

apple
apple
apple
banana
cherry
cherry
grape

では、-u オプションを使用して、ちょうど 1 回だけ出現するエントリを見つけましょう。

sort ~/project/fruits.txt | uniq -u

出力:

banana
grape

これは、「banana」と「grape」がファイル内で 1 回だけ出現していることを示しています。

実世界のアプリケーション: ログ分析

実世界のアプリケーションをシミュレートするために、簡単なログファイルを作成しましょう。

echo -e "INFO: System started\nERROR: Connection failed\nINFO: User logged in\nWARNING: Low memory\nERROR: Connection failed\nINFO: System started" > ~/project/system.log

では、このログファイルを分析して、どのタイプのメッセージが何回出現するかを調べましょう。

cat ~/project/system.log | sort | uniq -c

出力は以下のようになるはずです。

      2 ERROR: Connection failed
      2 INFO: System started
      1 INFO: User logged in
      1 WARNING: Low memory

これにより、ログファイル内のイベントのタイプとその頻度がすぐにわかります。

また、cut コマンドを使用して、メッセージのタイプ(INFO、ERROR、WARNING)のみを抽出することもできます。

cat ~/project/system.log | cut -d: -f1 | sort | uniq -c

出力:

      2 ERROR
      3 INFO
      1 WARNING

この分析により、6 つのログエントリのうち、3 つが INFO メッセージ、2 つが ERROR メッセージ、1 つが WARNING メッセージであることがわかります。

これらの例は、sortuniqcut などの単純なコマンドを組み合わせることで、Linux で強力なデータ処理パイプラインを作成できることを示しています。

まとめ

この実験では、Linux で uniq コマンドを使用してテキストファイル内の重複行をフィルタリングする方法を学びました。以下に、習得した主要な概念とスキルをまとめます。

  1. uniq の基本的な使い方uniq コマンドは、ファイル内の隣接する重複行を削除することを学びました。これは基本的な重複フィルタリングには便利ですが、制限があります。

  2. sortuniq の組み合わせ:ファイル内の位置に関係なくすべての重複を削除するには、まず sort コマンドでファイルをソートし、次に uniq でフィルタリングする必要があることを学びました。

  3. uniq の高度なオプション

    • 各行の出現回数をカウントする -c オプション
    • 重複行のみを表示する -d オプション
    • 一意の行(ちょうど 1 回だけ出現する行)のみを表示する -u オプション
  4. 実用的なアプリケーション:これらのコマンドが以下のような実世界のシナリオにどのように適用できるかを学びました。

    • ログファイルの分析
    • 一意のエントリの検索とカウント
    • データのクリーニングと準備

これらのスキルは、Linux 環境でテキストデータを扱う上で基本的なものであり、より高度なデータ処理タスクの基礎となります。sortuniq などの単純なコマンドを組み合わせることで、強力なデータ処理パイプラインを作成でき、テキストデータを効率的に管理および分析するのに役立ちます。