このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:重複行を取り除く:uniqコマンド

重複行を取り除く:uniqコマンド

 Linuxでテキストデータを扱う際、データ内の重複した行を取り除くことは、データの整理や解析において重要な作業です。uniqコマンドは、テキストファイル内の連続した同じ内容の行を省くためのコマンドで、IDリストやログファイルなどから重複行を取り除く際によく利用されます。

uniqコマンドの概要

uniqコマンドは、入力されたテキストデータの中で連続している重複行を検出し、それらを一つにまとめます。ただし、重複行が連続していない場合は、そのまま残ります。そのため、ファイル全体から重複行を完全に取り除きたい場合は、事前にsortコマンドでデータを並べ替える必要があります。

基本的な使い方

【書式】
uniq [オプション] [入力ファイル] [出力ファイル]

  • 入力ファイル:重複行を取り除きたいテキストファイルを指定します。
  • 出力ファイル:結果を保存するファイルを指定します。指定しない場合は標準出力に表示されます。

実例:重複行を含むファイルの処理

ファイルの準備

以下の内容の file1 というファイルをnanoエディタなどのテキストエディタで作成します。

user01@ubuntu-vm:~$ nano file1

file1の内容

Apple
Banana
Banana
Orange
Grape
Pineapple
Pineapple
Pineapple
Strawberry

uniqコマンドの適用

uniqコマンドを使って、重複行を取り除きます。

user01@ubuntu-vm:~$ uniq file1
Apple
Banana
Orange
Grape
Pineapple
Strawberry

結果

連続して重複していた “Banana” と “Pineapple” がそれぞれ一行にまとめられました。

注意点:連続していない重複行

uniqコマンドは、連続した重複行のみを処理します。重複行が離れている場合、取り除かれません。

例:重複行が連続していない場合

file2 というファイルを作成します。

user01@ubuntu-vm:~$ nano file2
file2の内容
Apple
Banana
Orange
Grape
Pineapple
Banana
Pineapple
Pineapple
Strawberry

uniqコマンドの適用

user01@ubuntu-vm:~$ uniq file2
Apple
Banana
Orange
Grape
Pineapple
Banana
Pineapple
Strawberry
結果

離れた位置にある “Banana” や “Pineapple” の重複行は取り除かれていません。

sortコマンドとの併用

ファイル全体から重複行を取り除くには、事前にsortコマンドでデータを並べ替えます。

user01@ubuntu-vm:~$ sort file2 | uniq
Apple
Banana
Grape
Orange
Pineapple
Strawberry

解説

  • sort file2:データをアルファベット順に並べ替えます。
  • | uniq:連続した重複行を取り除きます。

結果

ファイル全体から重複行が取り除かれました。

sortコマンドの-uオプション

sortコマンドの-uオプションを使用すると、重複行を取り除いた上でソートが可能です。

user01@ubuntu-vm:~$ sort -u file2
Apple
Banana
Grape
Orange
Pineapple
Strawberry

解説

sort -u はソートと同時に重複行を削除します。

uniqコマンドの主なオプション

重複行の数を数える:-cオプション

uniq -c を使用すると、連続した重複行の出現回数を表示できます。

例:file1の重複行数を表示

user01@ubuntu-vm:~$ sort file1 | uniq -c
      1 Apple
      2 Banana
      1 Grape
      1 Orange
      3 Pineapple
      1 Strawberry
解説
  • sort file1:データを並べ替え、重複行を連続させます。
  • uniq -c:各行の出現回数を表示します。

出現回数でソートする

出現回数の多い順や少ない順に並べ替えるには、sortコマンドと組み合わせます。

多い順に表示

user01@ubuntu-vm:~$ sort file1 | uniq -c | sort -rn
      3 Pineapple
      2 Banana
      1 Strawberry
      1 Orange
      1 Grape
      1 Apple
解説

sort -rn:数値を降順(大きい順)にソートします。

少ない順に表示

user01@ubuntu-vm:~$ sort file1 | uniq -c | sort -n
      1 Apple
      1 Grape
      1 Orange
      1 Strawberry
      2 Banana
      3 Pineapple
解説

sort -n:数値を昇順(小さい順)にソートします。

その他のオプション

  • -d:重複している行のみを表示します。
  • -u:一度だけ出現する行のみを表示します。

例:重複行のみ表示

user01@ubuntu-vm:~$ sort file1 | uniq -d
Banana
Pineapple

例:一度だけ出現する行を表示

user01@ubuntu-vm:~$ sort file1 | uniq -u
Apple
Grape
Orange
Strawberry

不要なファイルの削除

作成したファイルを削除します。

user01@ubuntu-vm:~$ rm file1 file2

まとめ

  • uniqコマンドは、連続した重複行を取り除くためのコマンドです。
  • 注意点:重複行が連続していない場合、uniqコマンドだけでは取り除けません。その場合は、sortコマンドでデータを並べ替えてからuniqを使用します。
  • 主なオプション
    -c:重複行の出現回数を表示する。
    -d:重複している行のみを表示する。
    -u:一度だけ出現する行のみを表示する。
  • 応用sortコマンドと組み合わせることで、データの出現回数のランキングを作成するなど、データ解析に活用できます。

 このように、uniqコマンドを活用することで、テキストデータの重複行を効率的に処理できます。データの整理や分析の際に、ぜひ活用してみてください。