uniqを理解する

uniqは隣接する同じ行をまとめるフィルタです。離れた位置の同じ行を見つけて全体から一つだけ残す処理ではありません。順序の前提と-c/-d/-uの違いを、小さなログで確認します。

この単元で学ぶこと

  • 隣接した重複と全体の重複を区別する
  • 件数・重複のみ・一回のみを選択する
  • sortとの組合せの意味を説明する

本文解説

隣の行と比較 printf 'a\na\nb\na\n' | uniqはa、b、aの三行です。最初のa二行だけが隣接グループとして一つになり、離れた最後のaは別グループです。元の行順を保ちながら連続反復だけを縮める用途に向いています。

ファイル全体でまとめる 同じ入力をsort | uniqへ渡すとa、bの二行です。sortで同じ行を隣り合わせにしたため、uniqが一つのグループとして処理できます。代わりに元の時系列順は失われます。順番を残したい要件で無条件にsortを加えないようにします。

グループの件数 uniq -cは各連続グループの行数を先頭へ付けます。a、a、bなら「2 a」「1 b」です。表示には桁揃え空白が付きます。a、b、aへ直接実行すると「1 a」「1 b」「1 a」で、aの総数2とは表示しません。

重複したグループだけ uniq -dは二回以上連続したグループを一行ずつ出力します。a、a、b、c、cならaとcです。-dは削除の頭文字と連想しやすいですが、ここでは重複グループだけを選びます。全出現回数を出すGNUの-Dとは区別します。

一回だけのグループ uniq -uは連続グループの長さが1の行だけを出します。a、a、b、c、cならbです。sort -uが重複を一つにして全種類を残す意味なのに対し、uniq -uは重複グループ自体を出さない点が違います。オプションの文字だけで意味を共通だと思わないようにします。

比較範囲と大小 uniq -iは大文字小文字を区別しない比較を行います。隣り合うAとaは一つのグループになり、通常その最初の行を出します。-f Nで比較時に先頭Nフィールドを飛ばすこともできますが、出力では飛ばした内容を削除するわけではありません。

入力と出力 uniq input.txtは結果を標準出力へ出します。別ファイルへ保存するならuniq input.txt output.txtなどを使い、元ファイルと出力先を同じにしないようにします。パイプで標準入力を受け取れば、sortや他の抽出処理の結果をまとめられます。

検証データ 連続重複、離れた重複、一回だけの行、空入力を用意します。最初にsortなしで-cを実行して連続グループを数え、次にsortありで全体の件数を数えます。-dと-uを同じ入力で比べれば、どの種類が残るかを具体的に確認できます。

図解

a a b aを処理する
全体集計には、同じ値を一つの連続グループにする前処理が必要。

重要ポイント

  • uniqは隣接する行を比較する。
  • -cは連続グループの件数。
  • -dは重複グループ、-uは一回のグループだけ。
  • 全体集計のsortは元の順序を変える。

間違えやすい点

  • 離れた同一行を自動で一つにすると思わない。
  • sort -uとuniq -uを同じ意味だと考えない。
  • -cの空白桁揃えをデータの一部と混同しない。

用語解説

連続グループ
隣り合い、比較上同じとされた行のまとまり。
重複
比較上同じ行が繰り返し現れること。
フィルタ
標準入力等を処理して標準出力へ結果を渡すコマンド。
隣接
間に別の行を挟まず並んでいること。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。