uniq - 同じ行を繰り返さずに表示する

スポンサーリンク

uniqコマンドは連続して重複する行を表示しないようにできます。

また、行がどのくらい重複しているかをカウントすることもでき、よくsortコマンドと組み合わせて使用されます。よく使用されるLinuxコマンドのひとつです。

uniqコマンドの構文

uniqコマンドの構文

ファイルが引数の場合は、そのファイルの内容について重複している行をチェックし、ファイルが省略されている場合は標準入力から重複している行をチェックします。

連続して重複している行の削除
(オプションなし)

uniqコマンドは連続して重複している行を削除して、表示できます。重複している行が多く、欲しい情報が見にくいときなどに使用することができます。

コマンド例

inputfile

実行結果

単純に重複している行を削除するにはsortコマンドとuniqコマンドの組み合わせやsortコマンドの-uオプションを用いることもできます。

コマンド例

または

実行結果

連続して重複している行をカウント
(-cオプション)

-cオプションを用いると、重複している行をカウントすることができます。-cオプションはcutコマンドsortコマンドと組み合わせて、データの集計などに利用できます。

コマンド例

実行結果

文字の大小を区別しない
(-iオプション)

-iオプションを用いると、行の比較について文字の大小を区別しません。また、uniqコマンドで表示される重複している行は、最初に現れた行が表示されます。

コマンド例

inputfile2

実行結果

sortコマンドの-fオプションは文字の大小を区別しない並び替えになります。

連続して重複している行のみを表示
(-dオプション)

-dオプションを用いると、連続して重複している行のみを表示します。

コマンド例

実行結果

連続して重複していない行のみを表示
(-uオプション)

-uオプションを用いると、連続して重複していない行のみを表示します。

コマンド例

実行結果

行を比較する前に指定した文字数をスキップ
(-sオプション)

-sオプションは、重複している行を判定するときに、行を比較する前に指定した文字数分をスキップしてから重複しているかどうかの判定を行います。また、uniqコマンドで表示される重複している行は、最初に現れた行が表示されます。

コマンド例

inputfile3

実行結果

行を比較する前に指定したフィールド数をスキップ
(-fオプション)

-fオプションは、-sオプションと違い、フィールド数をスキップしてから重複しているかどうかの判定を行います。フィールドは、スペースまたはタブではない文字の連続になります。また、uniqコマンドで表示される重複している行は、最初に現れた行が表示されます。

コマンド例

inputfile4

実行結果

-sオプションと-fオプションを同時に使用した場合、-fオプションで指定したフィールド分をスキップした後に、-sオプションで指定した文字数分をスキップして比較を行います。また、フィールドをスキップするので、比較する文字がスペースやタブで始まっていることに注意が必要になります。

コマンド例

inputfile5

実行結果

指定した文字数で行を比較
(-wオプション)

-wオプションは、指定した文字数分を比較して、行が重複しているかどうかの判定を行います。-sオプションや-fオプションが指定されている場合はスキップが行われてから、-wオプションで指定した文字数分の比較が行われます。例だと、すべての行が"test"の文字列だけで比較するため、最初に現れた行だけが残っています。

コマンド例

実行結果

2回以上繰り返している行をそのまま表示
(-Dまたは--all-repeatedオプション)

-D(--all-repeated)オプションは、GNU拡張で、2回以上繰り返している行がそのまま出力されます。

コマンド例

inputfile6

実行結果

--all-repeatedオプションを用いるとき、以下のメソッドを指定することができます。

メソッドの一覧

メソッド意味
none重複行のグループに区切りを入れない(デフォルト)
prepend重複行のグループの手前に区切りをいれる
separate重複行のグループの間に区切りを入れる

prepend

グループの手前に区切りとして改行を入れます。

コマンド例と実行結果

separate

グループの間に区切りとして改行を入れます。

コマンド例と実行結果

グループを改行で区切る
(--groupオプション)

--groupオプションは、GNU拡張で連続して重複している行を一つのグループとして改行で区切って表示します。

コマンド例

実行結果

また、いくつかのメソッドを指定して、区切りの改行を入れる場所を変更することができます。

メソッドの一覧

メソッド意味
separate重複行のグループの間に区切りを入れる(デフォルト)
prepend重複行のグループの手前に区切りをいれる
append重複行のグループの後に区切りを入れる
both重複行のグループの前後に区切りを入れる

prepend

グループの手前に区切りとして改行を入れます。

コマンド例と実行結果

append

グループの後に区切りとして改行を入れます。

コマンド例と実行結果

both

グループの前後に区切りとして改行を入れます。

コマンド例と実行結果

参考

GNU Coreutils: uniq invocation