Linux

【uniq】ファイルで重複行を削除する|Linuxコマンド基礎

uniq

今回は、Linuxコマンドでファイルで重複行を削除する方法(uniqコマンド)について分かりやすくご説明いたします。

 

うちぱぱ
うちぱぱ
それでは始めましょう!

ファイルで重複行を削除する【uniq】

 

書式

uniq [オプション] [入力ファイル名 [出力ファイル名]]

オプション

-c 重複する行数を行頭に付加して出力
-f 項目数 空白かタブで区切られた「フィールド」数をスキップして同一行かを判断
+文字数 重複行チェックの前に文字数で指定した文字数をスキップ
-s 文字数 文字数をスキップして同一行かを判断
-i 大文字や小文字の区別を無視
-d 重複行がある行のみを表示
-u 重複しない行のみを表示
-w 文字数 各行の指定した文字数のみを重複判断。-fや-sを合わせた場合はスキップ後の文字数をチェック
-D 重複行を全て表示

 

入力ファイルの内容から、重複(同じ行が2つあること)しない行を出力ファイルに出力します。
入力ファイルが指定されていなかったり、「-」が指定されていた場合は、標準入力から入力を待ちます。また、出力ファイルが指定されていない場合は、標準出力に出力します。
入力はソート(並び替え)されている必要があります。ソートを行うには、sortを利用するとよいでしょう。

コマンド実行例

ファイルの中の重複する行を削除する

$ cat uchipapa.example.jp   ⇒重複した行をわざと作ったファイル
www   IN CNAME server     ⇒重複ターゲット1
www   IN CNAME server     ⇒重複ターゲット2
ftp   IN CNAME server
smtp  IN CNAME server
pop3  IN CNAME server
www   IN CNAME server     ⇒重複ターゲット3
$ uniq uchipapa.example.jp   ⇒並んで重複する行は出力される
www   IN CNAME server     ⇒重複ターゲット1、2
ftp   IN CNAME server
smtp  IN CNAME server
pop3  IN CNAME server
www   IN CNAME server     ⇒重複ターゲット3
$ sort uchipapa.example.jp | uniq  ⇒sort実行後にuniqを実行
ftp   IN CNAME server
smtp  IN CNAME server
pop3  IN CNAME server
www   IN CNAME server     ⇒重複ターゲット1

大文字や小文字を区別しないで重複した行を削除する

$ cat uchipapa.example.jp   ⇒大文字小文字を区別しないかを確認
www   IN CNAME server     ⇒重複ターゲット(小文字)
WWW   IN CNAME server     ⇒重複ターゲット(大文字)
ftp   IN CNAME server
smtp  IN CNAME server
pop3  IN CNAME server
$ uniq uchipapa.example.jp
www   IN CNAME server     ⇒重複してないことになる
WWW   IN CNAME server
ftp   IN CNAME server
smtp  IN CNAME server
pop3  IN CNAME server
$ uniq -i uchipapa.example.jp  ⇒-iオプションで解決(ただし並んでいないといけない)
                   「sort -f」で大文字を無視してソートする
www   IN CNAME server     ⇒重複ターゲット
ftp   IN CNAME server
smtp  IN CNAME server
pop3  IN CNAME server

 

うちぱぱ
うちぱぱ
今回は以上となります!