Linux uniq コマンド:重複行のフィルタリング

LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、テキストファイル内の重複行を特定してフィルタリングするための強力なツールである Linux の uniq コマンドについて学習します。あなたは EC サイトのデータアナリストとして、顧客の購入データを分析するというシナリオで進めていきます。uniq コマンドを使いこなすことで、データを効率的に処理し、顧客の行動に関する貴重な洞察を得ることができます。

生の顧客データの確認

まずは、分析対象となる生の顧客購入データを確認しましょう。このデータには、顧客による日々の購入記録が含まれています。

最初に、プロジェクトディレクトリに移動する必要があります。Linux では、ディレクトリを移動するために cd コマンドを使用します。チルダ(~)は、自分のホームディレクトリを表すショートカットです。

cd ~/project

このコマンドにより、現在の作業ディレクトリが /home/labex/project に変更されます。正しいディレクトリに移動できたら、顧客データファイルの内容を表示してみましょう。ここでは、ファイルの連結を意味する "concatenate" の略である cat コマンドを使用します。これはファイルの内容を表示する際によく使われるコマンドです。

cat customer_purchases.txt

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

Alice,Electronics
Bob,Books
Charlie,Clothing
Alice,Electronics
David,Home Goods
Bob,Books
Eve,Toys
Charlie,Clothing
Frank,Sports
Alice,Electronics

このファイルには顧客名と購入したカテゴリーが記録されており、一部の顧客は複数回購入しています。各行は 1 回の購入を表し、顧客名と購入した商品のカテゴリーがカンマで区切られています。

データの並べ替え

uniq コマンドを効果的に使用するためには、事前にデータを並べ替える(ソートする)必要があります。uniq コマンドは「隣接する」重複行に対してのみ機能するため、ソートを行うことで重複するエントリを確実に隣り合わせにする必要があります。

sort コマンドを使用して、顧客データをアルファベット順に並べ替えます。

sort customer_purchases.txt > sorted_purchases.txt

このコマンドの内容を解説します。

  • sort は、テキストの行を並べ替えるコマンドです。
  • customer_purchases.txt は、並べ替えの対象となる入力ファイルです。
  • > はリダイレクト演算子です。左側のコマンドの出力を受け取り、右側のファイルに書き込みます。
  • sorted_purchases.txt は、並べ替えたデータを保存する新しいファイル名です。

次に、並べ替えられたファイルの内容を確認してみましょう。

cat sorted_purchases.txt

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

Alice,Electronics
Alice,Electronics
Alice,Electronics
Bob,Books
Bob,Books
Charlie,Clothing
Charlie,Clothing
David,Home Goods
Eve,Toys
Frank,Sports

エントリが顧客名のアルファベット順に並んでいることに注目してください。このようにソートすることで、同じ顧客によるすべての購入記録がまとまります。これは次のステップで非常に重要になります。

uniq を使った重複エントリの削除

データがソートされたので、uniq コマンドを使って重複エントリを削除できます。これにより、ユニークな(重複のない)顧客購入リストが得られます。

次のコマンドを実行してください。

uniq sorted_purchases.txt unique_purchases.txt

このコマンドの内容を解説します。

  • uniq は、ファイル内の繰り返される行をフィルタリングするコマンドです。
  • sorted_purchases.txt は入力ファイル(ソート済みのデータ)です。
  • unique_purchases.txt は結果を保存する出力ファイルです。

uniq コマンドは sorted_purchases.txt からソートされたデータを読み取り、隣接する重複行を削除して、その結果を unique_purchases.txt という新しいファイルに保存します。

では、新しいファイルの内容を確認してみましょう。

cat unique_purchases.txt

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

Alice,Electronics
Bob,Books
Charlie,Clothing
David,Home Goods
Eve,Toys
Frank,Sports

これで、各顧客が一度だけ表示されるユニークな購入リストが作成されました。重複を排除することで、どのような種類の購入が行われたかを明確に把握できるようになります。

uniq -c による購入回数のカウント

uniq コマンドは、オプションを組み合わせることでさらに強力になります。-c オプションを使用して、各顧客が何回購入したかをカウントしてみましょう。

次のコマンドを実行してください。

uniq -c sorted_purchases.txt purchase_counts.txt

このコマンドの内容を解説します。

  • uniq は重複行をフィルタリングするコマンドです。
  • -c は、各行の先頭に出現回数を付加するよう uniq に指示するオプションです。
  • sorted_purchases.txt は入力ファイルです。
  • purchase_counts.txt は結果を保存する出力ファイルです。

このコマンドは、各ユニークな行の出現回数を数え、その結果を purchase_counts.txt に保存します。

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

cat purchase_counts.txt

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

   3 Alice,Electronics
   2 Bob,Books
   2 Charlie,Clothing
   1 David,Home Goods
   1 Eve,Toys
   1 Frank,Sports

各行の先頭にある数字は、その顧客が購入した回数を示しています。例えば、Alice は Electronics(電子機器)を 3 回購入しており、Frank は Sports(スポーツ用品)を 1 回購入していることがわかります。

uniq -d によるリピーターの特定

データアナリストとして、リピーター(複数回購入している顧客)を特定したい場合があります。uniq コマンドの -d オプションを使用すると、重複している行のみを表示できます。これは、複数回購入した顧客を抽出することを意味します。

次のコマンドを実行してください。

uniq -d sorted_purchases.txt repeat_customers.txt

このコマンドの内容を解説します。

  • uniq は重複行をフィルタリングするコマンドです。
  • -d は、重複している行のみを出力するよう指示するオプションです。
  • sorted_purchases.txt は入力ファイルです。
  • repeat_customers.txt は結果を保存する出力ファイルです。

このコマンドは sorted_purchases.txt 内の重複行を特定し、それらを repeat_customers.txt に保存します。

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

cat repeat_customers.txt

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

Alice,Electronics
Bob,Books
Charlie,Clothing

これらは 2 回以上購入した顧客です。この情報は、顧客ロイヤリティプログラムやターゲットを絞ったマーケティングキャンペーンに非常に役立ちます。

まとめ

この実験では、Linux の uniq コマンドを探索し、顧客購入データの分析への応用方法を学びました。習得した内容は以下の通りです。

  1. uniq を使用する前に、データを sort で準備する方法。
  2. uniq を使用して、ソート済みファイルから重複エントリを削除する方法。
  3. uniq -c を使用して、各ユニークな行の出現回数をカウントする方法。
  4. uniq -d を使用して、重複している行を特定する方法。

これらのスキルはデータ分析業務において非常に価値があり、大規模なデータセットから効率的に情報を処理し、洞察を抽出するのに役立ちます。

この実験では紹介しきれなかった uniq コマンドのその他の便利なオプションは以下の通りです。

  • -u: ユニークな行(一度だけしか現れない行)のみを表示する
  • -i: 比較時に大文字と小文字を区別しない
  • -f N: 比較時に最初の N 個のフィールドを無視する
  • -s N: 比較時に最初の N 文字を無視する