sort・uniq・wcの全体像

sortは行を並べ、uniqは隣接する重複をまとめ、wcは個数を数えます。三つをパイプでつなぐ前に、どの段階で何が変わるかを確認します。GNU Coreutils、LC_ALL=C、ASCII、LF改行で実習します。

この単元で学ぶこと

  • 三コマンドの役割を区別する
  • 全体の出現回数と種類数を求める
  • 数値順・重複・改行数の前提を検証する

本文解説

役割を分担 printf 'b\na\nb\n'で三行の入力を作ります。sortだけならa,b,bへ並び、uniqだけならb,a,bのままです。wc -lだけなら3です。どのコマンドも同じ「テキスト処理」ですが、並び、隣接グループ、改行数という対象が違います。

同じ値を隣にする sortは同じ行を隣接させるため、後ろのuniqが全体の重複を一つにできます。入力b,a,bをsort | uniqへ流すとa,bの二行になります。処理の順を逆にしたuniq | sortでは離れたbがまとめられずa,b,bです。

種類数を数える sort -u | wc -lで重複除去後の行数を求められます。a,b,bなら2です。uniq -u | wc -lは「一回しかない連続グループの数」になり別の問題を解きます。種類数を求めたいのか、一回だけの値を数えたいのかを言葉で固定します。

出現回数を付ける sort | uniq -cは値ごとの出現回数を求めます。b,a,bなら「1 a」「2 b」です。uniq -cの頭の数値を大きい順にするにはさらにsort -nrを使います。数の文字列としての逆順と数値の逆順は、10以上の値を含む入力で違いが見えます。

数値の並替え 2,10,1の三行は通常sortでは1,10,2、sort -nでは1,2,10です。数値の表記に先頭0がある場合、sort -n -uでは1と01が同値になりえます。数の同一性と文字列の同一性を混同して重複除去しないようにします。

数える単位 wc -lはLFの個数、-wは空白類で区切った語、-cはバイトです。printf 'a b\n'は1行、2語、4バイトです。末尾改行なしのabcは-lが0なので、元データをどう区切って保存しているかを確認します。

出力を点検 長いパイプを一度に実行する前に、sortだけ、その後uniq -c、最後wc等と途中結果を目視します。各コマンドの標準出力が次の標準入力へ流れます。標準エラーは通常の|には含まれないので、エラーがあっても最後の件数だけでは気付きにくい場合があります。

保存と再現 実習用の別ファイルへ出力して元データを保持します。入力と同じファイルへ>でリダイレクトしてはいけません。LC_ALL=C、固定したASCII入力、末尾LFを明示して結果を再現します。件数だけで成功とせず、期待した種類と数が途中結果にあるかも照合します。

図解

値ごとの件数を求める
並替えで連続グループを作ってから数える。

重要ポイント

  • sort→uniqの順で同じ行を隣接させる。
  • 種類数と出現回数は別。
  • sort -uとuniq -uは意味が異なる。
  • wc -lは改行数なので末尾改行にも注意する。

間違えやすい点

  • uniqだけで離れた重複も消えると思わない。
  • 数値集計を文字列順のまま並べない。
  • 最終件数だけで上流の成功を保証しない。

用語解説

種類数
比較上異なる値の個数。
出現回数
ある値がデータ中に現れた回数。
パイプ
前の標準出力を次の標準入力へ接続する仕組み。
改行
行を区切る文字。この実習ではLF。

関連教材

参考資料

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

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