[ 通常表示 ]  [ 簡易表示 ]  [ シンプル表示 ]

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

uniq【コマンド】

pointこの用語のポイント

pointUNIX系で使えるコマンドだよ

point重複行を削除するよ

スポンサーリンク

簡単に書くよ

uniq【コマンド】とは

重複行を削除するときに使うコマンド
です。

image piyo

詳しく書くよ

テキストファイルなどから他の行と重複する行を削除するときに使うコマンドが「uniq」コマンドです。
UNIX系(LinuxとかMacとか)で使えます。

「uniq」コマンドの書き方は

uniq [オプション] [処理対象ファイル] [処理結果ファイル]

です。

オプションは、ちらほらとあります。

オプション説明
-c重複した行数を行の先頭に表示する
prefix lines by the number of occurrences
--count重複した行数を行の先頭に表示する
prefix lines by the number of occurrences
-d重複行のみ表示する(複数行の重複は1行にまとめて表示)
only print duplicate lines, one for each group
--repeated重複行のみ表示する(複数行の重複は1行にまとめて表示)
only print duplicate lines, one for each group
-D重複行のみ表示する(複数行の重複もそのまま表示)
print all duplicate lines groups can be delimited with an empty line METHOD={none(default),prepend,separate}
--all-repeated重複行のみ表示する(複数行の重複もそのまま表示)
print all duplicate lines groups can be delimited with an empty line METHOD={none(default),prepend,separate}
-f【数字】【数字】分のフィールドを読み飛ばすらしいけど、よく分からん
avoid comparing the first N fields
--skip-fields=N【数字】【数字】分のフィールドを読み飛ばすらしいけど、よく分からん
avoid comparing the first N fields
--group重複行の区切りごとに1行空けて全部表示する
show all items, separating groups with an empty line METHOD={separate(default),prepend,append,both}
-i大文字・小文字を区別しない
ignore differences in case when comparing
--ignore-case大文字・小文字を区別しない
ignore differences in case when comparing
-s【数字】【数字】分の文字を読み飛ばすらしいけど、よく分からん
avoid comparing the first N characters
--skip-chars=N【数字】【数字】分の文字を読み飛ばすらしいけど、よく分からん
avoid comparing the first N characters
-u重複しない行のみ表示する
only print unique lines
--unique重複しない行のみ表示する
only print unique lines
-zうんちゃらかんちゃら
end lines with 0 byte, not newline
--zero-terminatedうんちゃらかんちゃら
end lines with 0 byte, not newline
-w【数字】各行の先頭から【数字】文字で判定する
compare no more than N characters in lines
--check-chars=【数字】各行の先頭から【数字】文字で判定する
compare no more than N characters in lines
--helpヘルプを表示する
display this help and exit
--versionバージョン情報を表示する
output version information and exit

ですね。

それでは、使い方を見ていきましょう。
前提として、以下の内容のテキストファイル「hoge.txt」があるとします。

piyo1
pi2
piyopiyo3
piyopiyo3
piyopiyo3
piyo1
piyo1
piyopiyo3
pi2
Pi2
pi2


オプションを何も指定しないで

uniq hoge.txt

を実行すると、以下の結果になります。

piyo1
pi2
piyopiyo3
piyo1
piyopiyo3
pi2
Pi2
pi2


重複行が1行にまとめて表示されています。
3行目の「piyo3」と4行目の「piyo1」が、実際には複数行(3行と2行)あります。
大文字と小文字は区別されるので、小文字はじまりの「piyo2」と大文字はじまりの「Piyo2」は別扱いです。

結果をテキストファイルに出力することも可能です。
例えば

uniq hoge.txt out.txt

を実行すると「uniq hoge.txt」の結果が「out.txt」に出力されます。

「-c」オプションは重複した行数を表示するオプションです。
例えば

uniq -c hoge.txt

を実行すると、以下の結果になります。

1 piyo1
1 pi2
3 piyopiyo3
2 piyo1
1 piyopiyo3
1 pi2
1 Pi2
1 pi2


各行の先頭に表示されているのが重複した行数です。
3行目の「piyo3」が実際には3行、4行目の「piyo1」が実際には2行あることが分かります。

「-d」オプションは重複行のみ表示するオプションです。
重複している行は、それぞれ1行にまとめられます。
例えば

uniq -d hoge.txt

を実行すると、以下の結果になります。

piyopiyo3
piyo1


重複行の「piyopiyo3」と「piyo1」のみ表示されました。

「-D」オプションも重複行のみ表示するオプションです。
ただし重複している行を、1行にまとめません。
そのまま表示します。
例えば

uniq -D hoge.txt

を実行すると、以下の結果になります。

piyopiyo3
piyopiyo3
piyopiyo3
piyo1
piyo1


3行重複している「piyopiyo3」が3行、2行重複している「piyo1」が2行、表示されました。

「--group」オプションを指定すると、重複行の区切りごとに空行が入ります。
例えば

uniq --group hoge.txt

を実行すると、以下の結果になります。

piyo1

pi2

piyopiyo3
piyopiyo3
piyopiyo3

piyo1
piyo1

piyopiyo3

pi2

Pi2

pi2


なお「--group」に続けて「separate」「prepend」「append」「both」の4つが指定可能です。

「separate」は未指定時と同じです。
区切り部分に空行が入ります。

「prepend」を指定すると、空行が区切りとなる行の上に付きます。
例えば

uniq --group=prepend hoge.txt

を実行すると、以下の結果になります。


piyo1

pi2

piyopiyo3
piyopiyo3
piyopiyo3

piyo1
piyo1

piyopiyo3

pi2

Pi2

pi2


パッと見で違いが分かりにくいですね。
1行目に空行が入っています。
最終行の下には空行が入っていません。
「prepend」は区切り行の上に空行が付くイメージです。

「append」を指定すると、空行が区切りとなる行の下に付きます。
例えば

uniq --group=append hoge.txt

を実行すると、以下の結果になります。

piyo1

pi2

piyopiyo3
piyopiyo3
piyopiyo3

piyo1
piyo1

piyopiyo3

pi2

Pi2

pi2



やっぱり、パッと見で違いが分かりにくいですね。
最終行の下に空行が入っています。
1行目には空行が入っていません。
「append」は区切り行の下に空行が付くイメージです。

「both」を指定すると、空行が区切りとなる行の上下に付きます。
「prepend」と「append」を両方指定するイメージです。
例えば

uniq --group=both hoge.txt

を実行すると、以下の結果になります。


piyo1

pi2

piyopiyo3
piyopiyo3
piyopiyo3

piyo1
piyo1

piyopiyo3

pi2

Pi2

pi2



やっぱり、パッと見で違いが分かりにくいですね。
1行目に空行が入っています。
最終行の下にも空行が入っています。
「both」は区切り行の上下に空行が付くイメージです。

うん、たいした違いはありませんね。

次に「-i」オプションの説明をします。
「-i」オプションは、大文字・小文字を区別しないオプションです。
例えば

uniq -i hoge.txt

を実行すると、以下の結果になります。

piyo1
pi2
piyopiyo3
piyo1
piyopiyo3
pi2


「-i」オプションを指定しない実行結果は

piyo1
pi2
piyopiyo3
piyo1
piyopiyo3
pi2
Pi2
pi2


でした。
最後の3行に注目してください。

pi2
Pi2
pi2




pi2

に、まとめられています。
「-i」オプションを指定したことによって、1文字目の「p」と「P」が同じ文字と判定されるようになったからです。

あとは、一応「-u」オプションも説明しておきましょう。
「-u」オプションは重複行以外を表示するオプションです。
例えば

uniq -u hoge.txt

を実行すると、以下の結果になります。

piyo1
pi2
piyopiyo3
pi2
Pi2
pi2


つまり、オプションを指定しないときと同じ動きをします。

最後に「-w」オプションです。
「-w」オプションは各行の比較する文字数を指定します。
例えば

uniq -w1 hoge.txt

を実行すると、以下の結果になります。

piyo1
Pi2
pi2


これは、各行の先頭1文字が同じだったら重複行と見なす指定だからです。

各行の1文字目は「p」か「P」です。
小文字の「p」で始まる行はすべて同じ行と見なされ、最初に登場した「piyo1」が表示されます。
次に、大文字の「P」が登場したので「Pi2」が表示され、最後に小文字の「p」で始まる「pi2」が表示されて終了です。

ですから、大文字・小文字を区別しない「-i」オプションも指定して

uniq -w1 -i hoge.txt

を実行すると、以下の結果になります。

piyo1

すべての行が重複行と判断されるからです。

uniqコマンドの使い方は、そんなところです。

image piyo2

一言でまとめるよ

まぁ「uniq」ってコマンドが出てきたら「重複行を削除するときに使うんだな~」と、お考えください。

一番上に戻るよ
スポンサーリンク