sort・uniq・wcのコマンド/運用演習
ログの値を集計する手順を、途中の出力まで追って確認します。並替えのキー、重複グループの選択、改行数の違いによって結果が変わる例を扱います。
この単元で学ぶこと
- 三コマンドの役割を区別する
- 全体の出現回数と種類数を求める
- 数値順・重複・改行数の前提を検証する
本文解説
時系列と集計を分ける 記録a,b,aをそのままuniq -cへ流すと1 a,1 b,1 aです。sortしてからなら2 a,1 bです。前者は連続区間、後者は値ごとの全体件数を示します。時系列の連続区間を残す要件では並替えない方法を選びます。
一回だけの値 記録a,b,aにsort | uniq -uを使うとbだけが残ります。uniq -uを単独で使えば全行が長さ1の連続グループなのでa,b,aが残ります。求めたい「一回」が連続区間内なのか全記録中なのかを定義します。
順序を逆にした実験 a,b,aをuniq | sortへ流すとa,a,b、sort | uniqならa,bです。パイプの順序を交換しても常に同じ結果になるわけではありません。各段階の出力を小さなファイルへ保存して差を確認します。
キーが等しい行 点数形式B,5とA,5をsort -t, -k2,2n -sへ渡せば入力順を保ちます。-sなしでは行全体の追加比較でA,5が先になるので、同点者を入力順で残したいかを考えて指定します。キーだけを取り出して出す処理ではありません。
比較しない列 x cat,y cat,z dogのように空白区切りの行をuniq -f 1へ渡すと、先頭フィールドを比較から除外します。x catとy catの残りが同じなので最初のx catが代表となります。出力からxやzを削る列抽出とは違います。
改行なしの入力 printf 'a\nb'の-lは1、-cは3です。最後のbは文字として存在していても、そこに末尾LFはありません。sortはGNU実装では入力末尾の不足するLFを補うので、sortの前後で-lが変わる場合もあります。元入力と加工後のどちらの件数が必要かを決めます。
複数ファイルと表示 wc -l a.txt b.txtはそれぞれの件数と合計を出します。単一の数値だけを次の計算に渡したければ入力リダイレクトや明示した列抽出など、形式をそろえる必要があります。桁揃え空白、ファイル名、合計行を数字の一部と誤読しないようにします。
検証を完了する 既知の入力で期待する並び、グループ数、個数を手計算します。数値順と文字順の両方、離れた重複、空入力、末尾改行なしを含めて確認します。パイプの各終了状態とエラー出力も点検し、最終値だけが合ったことを全処理成功の根拠にしません。
図解
重要ポイント
- sort→uniqの順で同じ行を隣接させる。
- 種類数と出現回数は別。
- sort -uとuniq -uは意味が異なる。
- wc -lは改行数なので末尾改行にも注意する。
間違えやすい点
- uniqだけで離れた重複も消えると思わない。
- 数値集計を文字列順のまま並べない。
- 最終件数だけで上流の成功を保証しない。
用語解説
- 種類数
- 比較上異なる値の個数。
- 出現回数
- ある値がデータ中に現れた回数。
- パイプ
- 前の標準出力を次の標準入力へ接続する仕組み。
- 改行
- 行を区切る文字。この実習ではLF。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。