uniqコマンドは連続して重複する行を表示しないようにできます。
また、行がどのくらい重複しているかをカウントすることもでき、よくsortコマンドと組み合わせて使用されます。よく使用されるLinuxコマンドのひとつです。
目次
- 1 uniqコマンドの構文
- 2 uniqコマンドの使用例
- 2.1 連続して重複している行の削除 (オプションなし)
- 2.2 連続して重複している行をカウント (-cオプション)
- 2.3 文字の大小を区別しない (-iオプション)
- 2.4 連続して重複している行のみを表示 (-dオプション)
- 2.5 連続して重複していない行のみを表示 (-uオプション)
- 2.6 行を比較する前に指定した文字数をスキップ (-sオプション)
- 2.7 行を比較する前に指定したフィールド数をスキップ (-fオプション)
- 2.8 指定した文字数で行を比較 (-wオプション)
- 2.9 2回以上繰り返している行をそのまま表示 (-Dまたは--all-repeatedオプション)
- 2.10 グループを改行で区切る (--groupオプション)
- 3 参考
uniqコマンドの構文
uniqコマンドの構文
1 |
uniq [option]... [file]... |
ファイルが引数の場合は、そのファイルの内容について重複している行をチェックし、ファイルが省略されている場合は標準入力から重複している行をチェックします。
uniqコマンドの使用例
連続して重複している行の削除
(オプションなし)
uniqコマンドは連続して重複している行を削除して、表示できます。重複している行が多く、欲しい情報が見にくいときなどに使用することができます。
コマンド例
1 |
uniq inputfile |
inputfile
1 2 3 4 5 |
test1 test1 test2 test1 test3 |
実行結果
1 2 3 4 |
test1 test2 test1 test3 |
コマンド例
1 |
sort inputfile | uniq |
実行結果
1 2 3 |
test1 test2 test3 |
コマンド例
1 |
sort -u inputfile |
実行結果
1 2 3 |
test1 test2 test3 |
連続して重複している行をカウント
(-cオプション)
-cオプションを用いると、重複している行をカウントすることができます。-cオプションはcutコマンドやsortコマンドと組み合わせて、データの集計などに利用できます。
コマンド例
1 |
sort inputfile | uniq -c |
inputfile
1 2 3 4 5 |
test1 test1 test2 test1 test3 |
実行結果
1 2 3 |
3 test1 1 test2 1 test3 |
文字の大小を区別しない
(-iオプション)
-iオプションを用いると、行の比較について文字の大小を区別しません。また、uniqコマンドで表示される重複している行は、最初に現れた行が表示されます。
コマンド例
1 |
sort -f inputfile2 | uniq -i -c |
inputfile2
1 2 3 4 5 6 |
test1 test1 test2 TEST1 test3 Test2 |
実行結果
1 2 3 |
3 TEST1 2 Test2 1 test3 |
連続して重複している行のみを表示
(-dオプション)
-dオプションを用いると、連続して重複している行のみを表示します。
コマンド例
1 |
uniq -d inputfile |
inputfile
1 2 3 4 5 |
test1 test1 test2 test1 test3 |
実行結果
1 |
test1 |
連続して重複していない行のみを表示
(-uオプション)
-uオプションを用いると、連続して重複していない行のみを表示します。
コマンド例
1 |
uniq -u inputfile |
inputfile
1 2 3 4 5 |
test1 test1 test2 test1 test3 |
実行結果
1 2 3 |
test2 test1 test3 |
行を比較する前に指定した文字数をスキップ
(-sオプション)
-sオプションは、重複している行を判定するときに、行を比較する前に指定した文字数分をスキップしてから重複しているかどうかの判定を行います。また、uniqコマンドで表示される重複している行は、最初に現れた行が表示されます。
コマンド例
1 |
uniq -s 1 inputfile3 |
inputfile3
1 2 3 4 |
atest1 btest1 ctest1 dtest2 |
実行結果
1 2 |
atest1 dtest2 |
行を比較する前に指定したフィールド数をスキップ
(-fオプション)
-fオプションは、-sオプションと違い、フィールド数をスキップしてから重複しているかどうかの判定を行います。フィールドは、スペースまたはタブではない文字の連続になります。また、uniqコマンドで表示される重複している行は、最初に現れた行が表示されます。
コマンド例
1 |
uniq -f 1 inputfile4 |
inputfile4
1 2 3 4 5 |
1 test1 2 test1 3 test2 4 test1 5 test3 |
実行結果
1 2 3 4 |
1 test1 3 test2 4 test1 5 test3 |
コマンド例
1 |
uniq -s 2 -f 1 inputfile5 |
inputfile5
1 2 3 4 5 |
1 atest1 2 btest1 3 ctest1 4 dtest1 5 etest2 |
実行結果
1 2 |
1 atest1 5 etest2 |
指定した文字数で行を比較
(-wオプション)
-wオプションは、指定した文字数分を比較して、行が重複しているかどうかの判定を行います。-sオプションや-fオプションが指定されている場合はスキップが行われてから、-wオプションで指定した文字数分の比較が行われます。
コマンド例
1 |
uniq -w 4 inputfile |
inputfile
1 2 3 4 5 |
test1 test1 test2 test1 test3 |
実行結果
1 |
test1 |
2回以上繰り返している行をそのまま表示
(-Dまたは--all-repeatedオプション)
-D(--all-repeated)オプションは、GNU拡張で、2回以上繰り返している行がそのまま出力されます。
コマンド例
1 |
uniq -D inputfile6 |
inputfile6
1 2 3 4 5 6 |
test1 test1 test1 test3 test2 test2 |
実行結果
1 2 3 4 5 |
test1 test1 test1 test2 test2 |
--all-repeatedオプションを用いるとき、以下のメソッドを指定することができます。
メソッドの一覧
メソッド | 意味 |
none | 重複行のグループに区切りを入れない(デフォルト) |
prepend | 重複行のグループの手前に区切りをいれる |
separate | 重複行のグループの間に区切りを入れる |
prepend
グループの手前に区切りとして改行を入れます。
コマンド例
1 |
uniq --all-repeated=prepend inputfile6 |
実行結果
1 2 3 4 5 6 7 |
test1 test1 test1 test2 test2 |
separate
グループの間に区切りとして改行を入れます。
コマンド例
1 |
uniq --all-repeated=separate inputfile6 |
実行結果
1 2 3 4 5 6 |
test1 test1 test1 test2 test2 |
グループを改行で区切る
(--groupオプション)
--groupオプションは、GNU拡張で連続して重複している行を一つのグループとして改行で区切って表示します。
コマンド例
1 |
uniq --group inputfile6 |
inputfile6
1 2 3 4 5 6 |
test1 test1 test1 test3 test2 test2 |
実行結果
1 2 3 4 5 6 7 8 |
test1 test1 test1 test3 test2 test2 |
また、いくつかのメソッドを指定して、区切りの改行を入れる場所を変更することができます。
メソッドの一覧
メソッド | 意味 |
separate | 重複行のグループの間に区切りを入れる(デフォルト) |
prepend | 重複行のグループの手前に区切りをいれる |
append | 重複行のグループの後に区切りを入れる |
both | 重複行のグループの前後に区切りを入れる |
prepend
グループの手前に区切りとして改行を入れます。
コマンド例
1 |
uniq --group=prepend inputfile6 |
実行結果
1 2 3 4 5 6 7 8 9 |
test1 test1 test1 test3 test2 test2 |
append
グループの後に区切りとして改行を入れます。
コマンド例
1 |
uniq --group=append inputfile6 |
実行結果
1 2 3 4 5 6 7 8 9 |
test1 test1 test1 test3 test2 test2 |
both
グループの前後に区切りとして改行を入れます。
コマンド例
1 |
uniq --group=both inputfile6 |
実行結果
1 2 3 4 5 6 7 8 9 10 |
test1 test1 test1 test3 test2 test2 |