Linuxではuniq
コマンドとsort
コマンドを使用して、テキストファイルの重複行を抽出・削除することができます。
ここではそのやり方を紹介します。
環境
- OS:CentOS Linux release 8.1.1911
[root@centos8 work]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
[root@centos8 work]#
1. uniqコマンド
uniq
コマンドの書式は以下の通りです。
uniq [オプション]... [入力ファイル [出力ファイル]]
uniqコマンドの主なオプションは以下の通りです。
オプション | 長いオプション | 内容 |
---|---|---|
-c | --count | 各行の前に重複回数を出力する |
-u | --unique | 重複していない行だけを出力する |
-d | --repeated | 重複した行だけを出力する |
-D | --all-repeated | 重複した行を全て出力する |
-i | --ignore-case | 比較時に大文字と小文字の違いを無視する |
-w N | --check-chars=N | 行の比較を最初のN文字で行う |
-s N | --skip-chars=N | 最初のN文字を比較しない |
-f N | --skip-fields=N | 最初のN個のフィールドを比較しない |
-z | --zero-terminated | 最後にNULL文字を出力する |
2. 重複行を抽出
重複行を抽出する場合、以下のコマンドを使用します。
uniq -d <ファイル名>
以下、試してみます。
以下のファイルがあるとします。
Java
HTML
HTML
JavaScript
JavaScript
Tomcat
Apache
2, 3行目の「HTML」、4, 5行目の「JavaScript」が重複しています。
ここで、以下のコマンドを実行すると、重複行だけ表示されます。
uniq -d sample01.txt
[root@centos8 work]# uniq -d sample01.txt
HTML
JavaScript
[root@centos8 work]#
ファイルに出力する場合、以下のコマンドを実行します。
uniq -d sample01.txt <出力ファイル>
[root@centos8 work]# uniq -d sample01.txt result01.txt
[root@centos8 work]# cat result01.txt
HTML
JavaScript
[root@centos8 work]#
3. 重複行を削除
重複行を削除する場合、以下のコマンドを使用します。
uniq <ファイル名>
以下、試してみます。
同じく、以下のファイルがあるとします。
Java
HTML
HTML
JavaScript
JavaScript
Tomcat
Apache
2, 3行目の「HTML」、4, 5行目の「JavaScript」が重複しています。
ここで、以下のコマンドを実行すると、重複行が削除されて表示されます。
uniq sample01.txt
[root@centos8 work]# uniq sample01.txt
Java
HTML
JavaScript
Tomcat
Apache
[root@centos8 work]#
ファイルに出力する場合、以下のコマンドを実行します。
uniq sample01.txt <出力ファイル>
[root@centos8 work]# uniq sample01.txt result02.txt
[root@centos8 work]# cat result02.txt
Java
HTML
JavaScript
Tomcat
Apache
[root@centos8 work]#
次に以下のファイルがあるとします。
Java
HTML
HTML
JavaScript
JavaScript
HTML
Tomcat
Apache
2, 3, 6行目の「HTML」、4, 5行目の「JavaScript」が重複しています。
ここで
uniq sample02.txt
を実行すると以下となります。
[root@centos8 work]# uniq sample02.txt
Java
HTML
JavaScript
HTML
Tomcat
Apache
[root@centos8 work]#
「HTML」の文字が2回表示されます。
連続している重複(2,3行目の「HTML」)は取り除かれますが、離れている重複行(6行目の「HTML」)は削除されません。
この場合、sort
コマンドでソートしてあと、uniq
コマンドで重複行を削除します。
sort sample02.txt | uniq
[root@centos8 work]# sort sample02.txt | uniq
Apache
HTML
Java
JavaScript
Tomcat
[root@centos8 work]#
順番は変わってしますが、重複行は削除されました。
ファイルに出力する場合、以下のコマンドを実行します。
sort sample02.txt | uniq > <出力ファイル>
[root@centos8 work]# sort sample02.txt | uniq > result03.txt
[root@centos8 work]# cat result03.txt
Apache
HTML
Java
JavaScript
Tomcat
[root@centos8 work]#