uvp と rg・sed の突き合わせ 81項目 — スクリプトの動作ログ(3GB / 10GB / 50GB)

技術解説

【追記 2026-09-17】3GBで負けたと思っていたら、勝っていた(ただし冷えていれば)

この記事には「3GB は ripgrep が速い」という趣旨の記述があります。それは ファイルが OS のキャッシュに載っているときの話でした。sudo purge の直後(=しばらくぶりにそのファイルを開くとき)に測り直すと、3GB でも uvp が 2.6倍速いです。

3GB・固定文字列「東京」 rg uvp
コールド(purge 直後) 3.26秒 1.25秒(2.6倍)
ウォーム(続けて2回目) 0.33秒 1.01秒

7種類の検索のうち6つで同じ傾向でした(uvp 1.6.3)。詳しくは 3GBで負けたと思っていたら、勝っていた(ただし冷えていれば) に書いています。計測は Mac(Apple M4 / メモリ32GB / 外付け USB SSD)で、Windows・Linux(非力なノートPC・VMware 上)では傾向が変わる可能性があります。本文の以下の数字は、そのまま(ウォームでの計測)です。

ブログ記事に載せた uvp のコマンドを、rg / sort / uniq / sed / head / tail / gzip と 3GB・10GB・50GB の実データで突き合わせたスクリプト(uv_cli_test4.sh)の動作ログです。コマンドの意味や使い方は uvp コマンドを付けましたCLI → UwView Pro 対応表 に書いてあるので、ここでは繰り返しません。

動作ログ(全文・無編集)

 % ./uv_cli_test4.sh                                                
# 記事の uvp コマンド × CLI(rg / sort / uniq / sed)突き合わせ 20260915-170224-uvp4

| 項目 | 値 |
|---|---|
| OS | Darwin 25.3.0 arm64 |
| 機種 | Apple M4 / 32GB |
| uvp | /usr/local/bin/uvp uvp 1.6.0 |
| ripgrep | /opt/homebrew/bin/rg (ripgrep 15.2.0) |
| sed | /usr/bin/sed (BSD sed) |
| データ | /Volumes/BIWIN/26work/UwViewData/osm |
| .uwvz | 既にあるものを再利用(無ければ最初に作る) |
| 上限 | 全シャード合計。1語目が100万件を超えうる項目は `-limit none` 付き |
| 確認項目 | search icase regex drill invert grepform context seq tally sortcnt sortval headtail sorthead outtxt outgz sedline uwvzonly extract cat exit1 regexnl exit2 limitn limitnone replace replacere |

== 3G: osm/japan-dv-ai  3032812644 バイト
  .uwvz あり(251829224 バイト)→ 再利用します
  $ rg -n -F '東京' osm/japan-dv-ai
  $ uvp osm/japan-dv-ai '東京'
  ✅ 検索 東京              CLI     3.31 秒  uvp     0.79 秒  CLI/uvp=4.19 🟢         11274 件  exit=0  .uwvz 再利用
  $ rg -n -i -F tokyo osm/japan-dv-ai
  $ uvp osm/japan-dv-ai tokyo -i
  ✅ 大小無視 -i            CLI     0.53 秒  uvp     0.64 秒  CLI/uvp=1/1.21 🍊        2137 件  exit=0  .uwvz 再利用
  $ rg -n 'v="(bus_stop|traffic_signals)"' osm/japan-dv-ai
  $ uvp osm/japan-dv-ai 'v="(bus_stop|traffic_signals)"' -E
  ✅ 正規表現 -E            CLI     0.63 秒  uvp     0.79 秒  CLI/uvp=1/1.25 🍊       20620 件  exit=0  .uwvz 再利用
  $ rg -n -F 'k="amenity"' osm/japan-dv-ai | rg -F 'v="parking"'
  $ uvp osm/japan-dv-ai 'k="amenity"' 'v="parking"' -limit none
  ✅ 絞り込み 2語          CLI     0.46 秒  uvp     1.30 秒  CLI/uvp=1/2.83 🍊       94843 件  exit=0  .uwvz 再利用
  $ rg -n -F 'k="amenity"' osm/japan-dv-ai | rg -v -F 'v="parking"'
  $ uvp osm/japan-dv-ai 'k="amenity"' 'v="parking"' -v -limit none
  ✅ 除外 -v                  CLI     0.46 秒  uvp     1.33 秒  CLI/uvp=1/2.89 🍊       38373 件  exit=0  .uwvz 再利用
  $ uvp osm/japan-dv-ai 'k="amenity"' -grep 'v="parking"' -limit none
  ✅ 絞り込み -grep 記法  CLI        - 秒  uvp     1.39 秒  CLI/uvp=-                 94843 件  exit=0  2語並べた形と同じ結果か
  $ uvp osm/japan-dv-ai 'k="amenity"' -C 3 'k="name"' -limit none
  ・ ±3行の中に2語目 -C  CLI        - 秒  uvp     1.25 秒  CLI/uvp=-                 14301 件  exit=0  CLI に同じ意味の1コマンドは無い(rg -C は文脈を出すだけ)
  $ uvp osm/japan-dv-ai -seq 'k="amenity",k="name"' -limit none
  ・ 順序 -seq                CLI        - 秒  uvp     1.02 秒  CLI/uvp=-                 37125 件  exit=0  CLI に相当機能なし(awk の状態機械が要る)
  $ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-dv-ai | LC_ALL=C sort | uniq -c | sort -k1,1nr | head -20
  $ uvp osm/japan-dv-ai 'k="amenity"' -uniq 'v="([^"]+)"' -head 20 -limit none
  ✅ 集計 -uniq 上位20      CLI     0.45 秒  uvp     0.76 秒  CLI/uvp=1/1.69 🍊          20 件  exit=0  値と件数を集合として比較(sort|uniq -c|sort -rn|head)
  $ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-dv-ai | LC_ALL=C sort | uniq -c | sort -k1,1nr | head -20
  $ uvp osm/japan-dv-ai 'k="amenity"' -uniq 'v="([^"]+)"' -sort count -head 20 -limit none
  ✅ 集計+件数順 -sort count CLI     0.45 秒  uvp     0.89 秒  CLI/uvp=1/1.98 🍊          20 件  exit=0  同数の並び順は問わない(集合として比較)
  $ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-dv-ai | LC_ALL=C sort | uniq -c | LC_ALL=C sort -k2 | head -20
  $ uvp osm/japan-dv-ai 'k="amenity"' -uniq 'v="([^"]+)"' -sort value -head 20 -limit none
  ✅ 集計+値順 -sort value CLI     0.44 秒  uvp     0.87 秒  CLI/uvp=1/1.98 🍊          20 件  exit=0  値順の上位20(LC_ALL=C の並びで比較)
  $ rg -n -F '東京' osm/japan-dv-ai | head -10
  $ uvp osm/japan-dv-ai '東京' -head 10
  ✅ 先頭10件 -head          CLI     0.05 秒  uvp     0.74 秒  CLI/uvp=1/14.80 🍊         10 件  exit=0  rg は10件出た時点で終了(早期終了)。全件走査する形は次の sort→head 行
  $ rg -n -F '東京' osm/japan-dv-ai | tail -10
  $ uvp osm/japan-dv-ai '東京' -tail 10
  ✅ 末尾10件 -tail          CLI     0.34 秒  uvp     0.83 秒  CLI/uvp=1/2.44 🍊          10 件  exit=0  rg | tail は末尾を知るため全件走査(早期終了なし)
  $ rg -N -F '東京' osm/japan-dv-ai | LC_ALL=C sort | head -10
  $ uvp osm/japan-dv-ai '東京' -sort '^(.*)$' -head 10 --no-line-number
  ✅ 並べ替えて先頭10件 CLI     0.29 秒  uvp     0.70 秒  CLI/uvp=1/2.41 🍊          10 件  exit=0  rg | sort | head と同じか(LC_ALL=C・キーは行全体)
  $ rg -n -F '東京' osm/japan-dv-ai > cli-test-results/20260915-170224-uvp4/3G/rg_out.txt
  $ uvp osm/japan-dv-ai '東京' -out cli-test-results/20260915-170224-uvp4/3G/uvp_out.txt
  ✅ -out(テキスト)     CLI     0.35 秒  uvp     0.83 秒  CLI/uvp=1/2.37 🍊       11274 件  exit=0  書き出したファイルどうしを比較
  $ rg -n -F '東京' osm/japan-dv-ai | gzip -6 > cli-test-results/20260915-170224-uvp4/3G/rg_out.txt.gz
  $ uvp osm/japan-dv-ai '東京' -out cli-test-results/20260915-170224-uvp4/3G/uvp_out.txt.gz
  ✅ -out(.gz)              CLI     0.36 秒  uvp     0.84 秒  CLI/uvp=1/2.33 🍊       11274 件  exit=0  展開してから中身を比較
  $ sed -n '/東京/p' osm/japan-dv-ai
  $ uvp osm/japan-dv-ai '東京' --no-line-number
  ✅ 行だけ出す ↔ sed -n p CLI     9.61 秒  uvp     0.75 秒  CLI/uvp=12.81 🟢        11274 件  exit=0  sed の抽出と本文を比較(行番号なし)
  $ uvp osm/japan-dv-ai.uwvz '東京'
  ✅ .uwvz だけで検索      CLI        - 秒  uvp     0.74 秒  CLI/uvp=-                 11274 件  exit=0  元ファイルを見ずに .uwvz から検索
  $ uvp osm/japan-dv-ai.uwvz -extract -out cli-test-results/20260915-170224-uvp4/3G/extracted
  ✅ -extract(バイト一致) CLI        - 秒  uvp     3.62 秒  CLI/uvp=-                     - 件  exit=0  無料機能。元ファイルと cmp
  $ uvp cat osm/japan-dv-ai
  ✅ cat(本文をそのまま) CLI        - 秒  uvp     3.65 秒  CLI/uvp=-                     - 件  exit=0  元ファイルと cmp
  $ uvp osm/japan-dv-ai NO_SUCH_WORD_ZZ9
  ✅ 見つからない → exit 1 CLI        - 秒  uvp     0.66 秒  CLI/uvp=-                     0 件  exit=1  grep 互換(0=あり 1=なし)
  $ rg -n '[0-9]{3}-[0-9]{4}"' osm/japan-dv-ai
  $ uvp osm/japan-dv-ai '[0-9]{3}-[0-9]{4}"' -E
  ✅ 正規表現 -E(リテラルなし) CLI     2.46 秒  uvp     1.08 秒  CLI/uvp=2.28 🟢         14951 件  exit=0  必ず含む文字列が無い式=前置フィルタなし。regex の秒と比べる
  $ rg -n -F 'k="building"' osm/japan-dv-ai
  $ uvp osm/japan-dv-ai 'k="building"'
  ✅ 既定の上限(exit 2 / 全件) CLI     0.83 秒  uvp     0.59 秒  CLI/uvp=1.41 🟢       1000000 件  exit=2  上限 1000000 件で打ち切り(rg は 5747705 件)。ちょうど上限件数・行順・rg の部分集合
  $ uvp osm/japan-dv-ai '東京' -limit 1000
  ✅ -limit 1000                CLI        - 秒  uvp     0.32 秒  CLI/uvp=-                  1000 件  exit=2  上限 1000 件で打ち切り(rg は 11274 件)。ちょうど上限件数・行順・rg の部分集合
  $ uvp osm/japan-dv-ai 'k="building"' -limit none
  ✅ -limit none(全件)    CLI     0.83 秒  uvp     2.80 秒  CLI/uvp=1/3.37 🍊     5747705 件  exit=0  打ち切らずに rg と全件一致するか(5747705 件)

== 10G: osm/japan-dv-ac  10255315281 バイト
  .uwvz あり(1164605577 バイト)→ 再利用します
  $ rg -n -F '東京' osm/japan-dv-ac
  $ uvp osm/japan-dv-ac '東京'
  ✅ 検索 東京              CLI    11.19 秒  uvp     1.87 秒  CLI/uvp=5.98 🟢         11393 件  exit=0  .uwvz 再利用
  $ rg -n -i -F tokyo osm/japan-dv-ac
  $ uvp osm/japan-dv-ac tokyo -i
  ✅ 大小無視 -i            CLI    11.13 秒  uvp     1.83 秒  CLI/uvp=6.08 🟢          1286 件  exit=0  .uwvz 再利用
  $ rg -n 'v="(bus_stop|traffic_signals)"' osm/japan-dv-ac
  $ uvp osm/japan-dv-ac 'v="(bus_stop|traffic_signals)"' -E
  ✅ 正規表現 -E            CLI    11.19 秒  uvp     2.00 秒  CLI/uvp=5.59 🟢        167126 件  exit=0  .uwvz 再利用
  $ rg -n -F 'k="amenity"' osm/japan-dv-ac | rg -F 'v="parking"'
  $ uvp osm/japan-dv-ac 'k="amenity"' 'v="parking"' -limit none
  ✅ 絞り込み 2語          CLI    11.14 秒  uvp     3.75 秒  CLI/uvp=2.97 🟢          2659 件  exit=0  .uwvz 再利用
  $ rg -n -F 'k="amenity"' osm/japan-dv-ac | rg -v -F 'v="parking"'
  $ uvp osm/japan-dv-ac 'k="amenity"' 'v="parking"' -v -limit none
  ✅ 除外 -v                  CLI    11.03 秒  uvp     3.96 秒  CLI/uvp=2.79 🟢        168887 件  exit=0  .uwvz 再利用
  $ uvp osm/japan-dv-ac 'k="amenity"' -grep 'v="parking"' -limit none
  ✅ 絞り込み -grep 記法  CLI        - 秒  uvp     3.75 秒  CLI/uvp=-                  2659 件  exit=0  2語並べた形と同じ結果か
  $ uvp osm/japan-dv-ac 'k="amenity"' -C 3 'k="name"' -limit none
  ・ ±3行の中に2語目 -C  CLI        - 秒  uvp     3.90 秒  CLI/uvp=-                 66778 件  exit=0  CLI に同じ意味の1コマンドは無い(rg -C は文脈を出すだけ)
  $ uvp osm/japan-dv-ac -seq 'k="amenity",k="name"' -limit none
  ・ 順序 -seq                CLI        - 秒  uvp     2.97 秒  CLI/uvp=-                118625 件  exit=0  CLI に相当機能なし(awk の状態機械が要る)
  $ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-dv-ac | LC_ALL=C sort | uniq -c | sort -k1,1nr | head -20
  $ uvp osm/japan-dv-ac 'k="amenity"' -uniq 'v="([^"]+)"' -head 20 -limit none
  ✅ 集計 -uniq 上位20      CLI    11.05 秒  uvp     2.15 秒  CLI/uvp=5.14 🟢            20 件  exit=0  値と件数を集合として比較(sort|uniq -c|sort -rn|head)
  $ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-dv-ac | LC_ALL=C sort | uniq -c | sort -k1,1nr | head -20
  $ uvp osm/japan-dv-ac 'k="amenity"' -uniq 'v="([^"]+)"' -sort count -head 20 -limit none
  ✅ 集計+件数順 -sort count CLI    11.07 秒  uvp     2.00 秒  CLI/uvp=5.54 🟢            20 件  exit=0  同数の並び順は問わない(集合として比較)
  $ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-dv-ac | LC_ALL=C sort | uniq -c | LC_ALL=C sort -k2 | head -20
  $ uvp osm/japan-dv-ac 'k="amenity"' -uniq 'v="([^"]+)"' -sort value -head 20 -limit none
  ✅ 集計+値順 -sort value CLI    11.07 秒  uvp     2.15 秒  CLI/uvp=5.15 🟢            20 件  exit=0  値順の上位20(LC_ALL=C の並びで比較)
  $ rg -n -F '東京' osm/japan-dv-ac | head -10
  $ uvp osm/japan-dv-ac '東京' -head 10
  ✅ 先頭10件 -head          CLI     0.48 秒  uvp     1.50 秒  CLI/uvp=1/3.12 🍊          10 件  exit=0  rg は10件出た時点で終了(早期終了)。全件走査する形は次の sort→head 行
  $ rg -n -F '東京' osm/japan-dv-ac | tail -10
  $ uvp osm/japan-dv-ac '東京' -tail 10
  ✅ 末尾10件 -tail          CLI    10.61 秒  uvp     1.95 秒  CLI/uvp=5.44 🟢            10 件  exit=0  rg | tail は末尾を知るため全件走査(早期終了なし)
  $ rg -N -F '東京' osm/japan-dv-ac | LC_ALL=C sort | head -10
  $ uvp osm/japan-dv-ac '東京' -sort '^(.*)$' -head 10 --no-line-number
  ✅ 並べ替えて先頭10件 CLI    11.98 秒  uvp     1.99 秒  CLI/uvp=6.02 🟢            10 件  exit=0  rg | sort | head と同じか(LC_ALL=C・キーは行全体)
  $ rg -n -F '東京' osm/japan-dv-ac > cli-test-results/20260915-170224-uvp4/10G/rg_out.txt
  $ uvp osm/japan-dv-ac '東京' -out cli-test-results/20260915-170224-uvp4/10G/uvp_out.txt
  ✅ -out(テキスト)     CLI    10.98 秒  uvp     2.00 秒  CLI/uvp=5.49 🟢         11393 件  exit=0  書き出したファイルどうしを比較
  $ rg -n -F '東京' osm/japan-dv-ac | gzip -6 > cli-test-results/20260915-170224-uvp4/10G/rg_out.txt.gz
  $ uvp osm/japan-dv-ac '東京' -out cli-test-results/20260915-170224-uvp4/10G/uvp_out.txt.gz
  ✅ -out(.gz)              CLI    11.06 秒  uvp     1.86 秒  CLI/uvp=5.95 🟢         11393 件  exit=0  展開してから中身を比較
  $ sed -n '/東京/p' osm/japan-dv-ac
  $ uvp osm/japan-dv-ac '東京' --no-line-number
  ✅ 行だけ出す ↔ sed -n p CLI    14.01 秒  uvp     1.81 秒  CLI/uvp=7.74 🟢         11393 件  exit=0  sed の抽出と本文を比較(行番号なし)
  $ uvp osm/japan-dv-ac.uwvz '東京'
  ✅ .uwvz だけで検索      CLI        - 秒  uvp     1.55 秒  CLI/uvp=-                 11393 件  exit=0  元ファイルを見ずに .uwvz から検索
  $ uvp osm/japan-dv-ac.uwvz -extract -out cli-test-results/20260915-170224-uvp4/10G/extracted
  ✅ -extract(バイト一致) CLI        - 秒  uvp    12.93 秒  CLI/uvp=-                     - 件  exit=0  無料機能。元ファイルと cmp
  $ uvp cat osm/japan-dv-ac
  ✅ cat(本文をそのまま) CLI        - 秒  uvp    38.47 秒  CLI/uvp=-                     - 件  exit=0  元ファイルと cmp
  $ uvp osm/japan-dv-ac NO_SUCH_WORD_ZZ9
  ✅ 見つからない → exit 1 CLI        - 秒  uvp     1.95 秒  CLI/uvp=-                     0 件  exit=1  grep 互換(0=あり 1=なし)
  $ rg -n '[0-9]{3}-[0-9]{4}"' osm/japan-dv-ac
  $ uvp osm/japan-dv-ac '[0-9]{3}-[0-9]{4}"' -E
  ✅ 正規表現 -E(リテラルなし) CLI    14.38 秒  uvp     2.43 秒  CLI/uvp=5.92 🟢         24988 件  exit=0  必ず含む文字列が無い式=前置フィルタなし。regex の秒と比べる
  $ rg -n -F 'k="building"' osm/japan-dv-ac
  $ uvp osm/japan-dv-ac 'k="building"'
  ✅ 既定の上限(exit 2 / 全件) CLI    11.13 秒  uvp     1.92 秒  CLI/uvp=5.80 🟢           861 件  exit=0  上限 ? 件に達せず全件(rg と同じ 861 件)
  $ uvp osm/japan-dv-ac '東京' -limit 1000
  ✅ -limit 1000                CLI        - 秒  uvp     0.63 秒  CLI/uvp=-                  1000 件  exit=2  上限 1000 件で打ち切り(rg は 11393 件)。ちょうど上限件数・行順・rg の部分集合
  $ uvp osm/japan-dv-ac 'k="building"' -limit none
  ✅ -limit none(全件)    CLI    11.13 秒  uvp     1.47 秒  CLI/uvp=7.57 🟢           861 件  exit=0  打ち切らずに rg と全件一致するか(861 件)

== 50G: osm/japan-latest.osm  51254526392 バイト
  .uwvz あり(5737517251 バイト)→ 再利用します
  $ rg -n -F '東京' osm/japan-latest.osm
  $ uvp osm/japan-latest.osm '東京'
  ✅ 検索 東京              CLI    55.66 秒  uvp     7.15 秒  CLI/uvp=7.78 🟢         94979 件  exit=0  .uwvz 再利用
  $ rg -n -i -F tokyo osm/japan-latest.osm
  $ uvp osm/japan-latest.osm tokyo -i
  ✅ 大小無視 -i            CLI    56.26 秒  uvp     7.18 秒  CLI/uvp=7.84 🟢         14355 件  exit=0  .uwvz 再利用
  $ rg -n 'v="(bus_stop|traffic_signals)"' osm/japan-latest.osm
  $ uvp osm/japan-latest.osm 'v="(bus_stop|traffic_signals)"' -E
  ✅ 正規表現 -E            CLI    55.70 秒  uvp     7.75 秒  CLI/uvp=7.19 🟢        602805 件  exit=0  .uwvz 再利用
  $ rg -n -F 'k="amenity"' osm/japan-latest.osm | rg -F 'v="parking"'
  $ uvp osm/japan-latest.osm 'k="amenity"' 'v="parking"' -limit none
  ✅ 絞り込み 2語          CLI    55.33 秒  uvp    21.48 秒  CLI/uvp=2.58 🟢        460467 件  exit=0  .uwvz 再利用
  $ rg -n -F 'k="amenity"' osm/japan-latest.osm | rg -v -F 'v="parking"'
  $ uvp osm/japan-latest.osm 'k="amenity"' 'v="parking"' -v -limit none
  ✅ 除外 -v                  CLI    55.35 秒  uvp    21.10 秒  CLI/uvp=2.62 🟢        935987 件  exit=0  .uwvz 再利用
  $ uvp osm/japan-latest.osm 'k="amenity"' -grep 'v="parking"' -limit none
  ✅ 絞り込み -grep 記法  CLI        - 秒  uvp    20.34 秒  CLI/uvp=-                460467 件  exit=0  2語並べた形と同じ結果か
  $ uvp osm/japan-latest.osm 'k="amenity"' -C 3 'k="name"' -limit none
  ・ ±3行の中に2語目 -C  CLI        - 秒  uvp    19.88 秒  CLI/uvp=-                544212 件  exit=0  CLI に同じ意味の1コマンドは無い(rg -C は文脈を出すだけ)
  $ uvp osm/japan-latest.osm -seq 'k="amenity",k="name"' -limit none
  ・ 順序 -seq                CLI        - 秒  uvp    13.46 秒  CLI/uvp=-                846622 件  exit=0  CLI に相当機能なし(awk の状態機械が要る)
  $ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-latest.osm | LC_ALL=C sort | uniq -c | sort -k1,1nr | head -20
  $ uvp osm/japan-latest.osm 'k="amenity"' -uniq 'v="([^"]+)"' -head 20 -limit none
  ✅ 集計 -uniq 上位20      CLI    55.40 秒  uvp     8.33 秒  CLI/uvp=6.65 🟢            20 件  exit=0  値と件数を集合として比較(sort|uniq -c|sort -rn|head)
  $ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-latest.osm | LC_ALL=C sort | uniq -c | sort -k1,1nr | head -20
  $ uvp osm/japan-latest.osm 'k="amenity"' -uniq 'v="([^"]+)"' -sort count -head 20 -limit none
  ✅ 集計+件数順 -sort count CLI    55.25 秒  uvp     8.94 秒  CLI/uvp=6.18 🟢            20 件  exit=0  同数の並び順は問わない(集合として比較)
  $ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-latest.osm | LC_ALL=C sort | uniq -c | LC_ALL=C sort -k2 | head -20
  $ uvp osm/japan-latest.osm 'k="amenity"' -uniq 'v="([^"]+)"' -sort value -head 20 -limit none
  ✅ 集計+値順 -sort value CLI    55.28 秒  uvp     8.42 秒  CLI/uvp=6.57 🟢            20 件  exit=0  値順の上位20(LC_ALL=C の並びで比較)
  $ rg -n -F '東京' osm/japan-latest.osm | head -10
  $ uvp osm/japan-latest.osm '東京' -head 10
  ✅ 先頭10件 -head          CLI     0.16 秒  uvp     6.74 秒  CLI/uvp=1/42.12 🍊         10 件  exit=0  rg は10件出た時点で終了(早期終了)。全件走査する形は次の sort→head 行
  $ rg -n -F '東京' osm/japan-latest.osm | tail -10
  $ uvp osm/japan-latest.osm '東京' -tail 10
  ✅ 末尾10件 -tail          CLI    55.13 秒  uvp     8.10 秒  CLI/uvp=6.81 🟢            10 件  exit=0  rg | tail は末尾を知るため全件走査(早期終了なし)
  $ rg -N -F '東京' osm/japan-latest.osm | LC_ALL=C sort | head -10
  $ uvp osm/japan-latest.osm '東京' -sort '^(.*)$' -head 10 --no-line-number
  ✅ 並べ替えて先頭10件 CLI    55.26 秒  uvp     7.22 秒  CLI/uvp=7.65 🟢            10 件  exit=0  rg | sort | head と同じか(LC_ALL=C・キーは行全体)
  $ rg -n -F '東京' osm/japan-latest.osm > cli-test-results/20260915-170224-uvp4/50G/rg_out.txt
  $ uvp osm/japan-latest.osm '東京' -out cli-test-results/20260915-170224-uvp4/50G/uvp_out.txt
  ✅ -out(テキスト)     CLI    55.90 秒  uvp     7.60 秒  CLI/uvp=7.36 🟢         94979 件  exit=0  書き出したファイルどうしを比較
  $ rg -n -F '東京' osm/japan-latest.osm | gzip -6 > cli-test-results/20260915-170224-uvp4/50G/rg_out.txt.gz
  $ uvp osm/japan-latest.osm '東京' -out cli-test-results/20260915-170224-uvp4/50G/uvp_out.txt.gz
  ✅ -out(.gz)              CLI    55.95 秒  uvp     7.28 秒  CLI/uvp=7.69 🟢         94979 件  exit=0  展開してから中身を比較
  $ sed -n '/東京/p' osm/japan-latest.osm
  $ uvp osm/japan-latest.osm '東京' --no-line-number
  ✅ 行だけ出す ↔ sed -n p CLI   105.75 秒  uvp    12.31 秒  CLI/uvp=8.59 🟢         94979 件  exit=0  sed の抽出と本文を比較(行番号なし)
  $ uvp osm/japan-latest.osm.uwvz '東京'
  ✅ .uwvz だけで検索      CLI        - 秒  uvp     7.90 秒  CLI/uvp=-                 94979 件  exit=0  元ファイルを見ずに .uwvz から検索
  $ uvp osm/japan-latest.osm.uwvz -extract -out cli-test-results/20260915-170224-uvp4/50G/extracted
  ✅ -extract(バイト一致) CLI        - 秒  uvp    61.76 秒  CLI/uvp=-                     - 件  exit=0  無料機能。元ファイルと cmp
  $ uvp cat osm/japan-latest.osm
  ✅ cat(本文をそのまま) CLI        - 秒  uvp   243.12 秒  CLI/uvp=-                     - 件  exit=0  元ファイルと cmp
  $ uvp osm/japan-latest.osm NO_SUCH_WORD_ZZ9
  ✅ 見つからない → exit 1 CLI        - 秒  uvp     7.03 秒  CLI/uvp=-                     0 件  exit=1  grep 互換(0=あり 1=なし)
  $ rg -n '[0-9]{3}-[0-9]{4}"' osm/japan-latest.osm
  $ uvp osm/japan-latest.osm '[0-9]{3}-[0-9]{4}"' -E
  ✅ 正規表現 -E(リテラルなし) CLI    67.60 秒  uvp    12.88 秒  CLI/uvp=5.25 🟢        224915 件  exit=0  必ず含む文字列が無い式=前置フィルタなし。regex の秒と比べる
  $ rg -n -F 'k="building"' osm/japan-latest.osm
  $ uvp osm/japan-latest.osm 'k="building"'
  ✅ 既定の上限(exit 2 / 全件) CLI    60.35 秒  uvp     1.24 秒  CLI/uvp=48.67 🟢      1000000 件  exit=2  上限 1000000 件で打ち切り(rg は 29114490 件)。ちょうど上限件数・行順・rg の部分集合
  $ uvp osm/japan-latest.osm '東京' -limit 1000
  ✅ -limit 1000                CLI        - 秒  uvp     0.52 秒  CLI/uvp=-                  1000 件  exit=2  上限 1000 件で打ち切り(rg は 94979 件)。ちょうど上限件数・行順・rg の部分集合
  $ uvp osm/japan-latest.osm 'k="building"' -limit none
  ✅ -limit none(全件)    CLI    60.35 秒  uvp    27.12 秒  CLI/uvp=2.23 🟢      29114490 件  exit=0  打ち切らずに rg と全件一致するか(29114490 件)

== 置換 3G: osm/japan-dv-ai
  $ uvp osm/japan-dv-ai '東京' -replace TOKYO -out cli-test-results/20260915-170224-uvp4/3G/uvp_rep.txt
  $ rg -N -F --passthru '東京' -r TOKYO osm/japan-dv-ai > cli-test-results/20260915-170224-uvp4/3G/rg_rep.txt
  ✅ 置換 -replace ↔ rg --passthru CLI     7.06 秒  uvp     4.57 秒  CLI/uvp=1.54 🟢        11,361 件  exit=0  全文をバイト一致で比較(件数は置換した箇所)
  $ LC_ALL=C sed 's/東京/TOKYO/g' osm/japan-dv-ai > cli-test-results/20260915-170224-uvp4/3G/sed_rep.txt
  ✅ 置換 -replace ↔ sed s///g CLI    14.94 秒  uvp     4.57 秒  CLI/uvp=3.27 🟢        11,361 件  exit=0  全文をバイト一致で比較
  $ uvp osm/japan-dv-ai 'v="(bus_stop|traffic_signals)"' -E -replace 'v="X_$1"' -out cli-test-results/20260915-170224-uvp4/3G/uvp_repre.txt
  $ rg -N --passthru 'v="(bus_stop|traffic_signals)"' -r 'v="X_$1"' osm/japan-dv-ai > cli-test-results/20260915-170224-uvp4/3G/rg_repre.txt
  ✅ 置換 -E $1 ↔ rg --passthru CLI     4.97 秒  uvp     4.17 秒  CLI/uvp=1.19 🟢        20,620 件  exit=0  全文をバイト一致で比較(件数は置換した箇所)
  $ LC_ALL=C sed -E 's/v="(bus_stop|traffic_signals)"/v="X_\1"/g' osm/japan-dv-ai > cli-test-results/20260915-170224-uvp4/3G/sed_repre.txt
  ✅ 置換 -E $1 ↔ sed -E    CLI    24.81 秒  uvp     4.17 秒  CLI/uvp=5.95 🟢        20,620 件  exit=0  全文をバイト一致で比較

== 置換 10G: osm/japan-dv-ac
  $ uvp osm/japan-dv-ac '東京' -replace TOKYO -out cli-test-results/20260915-170224-uvp4/10G/uvp_rep.txt
  $ rg -N -F --passthru '東京' -r TOKYO osm/japan-dv-ac > cli-test-results/20260915-170224-uvp4/10G/rg_rep.txt
  ✅ 置換 -replace ↔ rg --passthru CLI    26.89 秒  uvp    13.47 秒  CLI/uvp=2.00 🟢        11,445 件  exit=0  全文をバイト一致で比較(件数は置換した箇所)
  $ LC_ALL=C sed 's/東京/TOKYO/g' osm/japan-dv-ac > cli-test-results/20260915-170224-uvp4/10G/sed_rep.txt
  ✅ 置換 -replace ↔ sed s///g CLI    26.51 秒  uvp    13.47 秒  CLI/uvp=1.97 🟢        11,445 件  exit=0  全文をバイト一致で比較
  $ uvp osm/japan-dv-ac 'v="(bus_stop|traffic_signals)"' -E -replace 'v="X_$1"' -out cli-test-results/20260915-170224-uvp4/10G/uvp_repre.txt
  $ rg -N --passthru 'v="(bus_stop|traffic_signals)"' -r 'v="X_$1"' osm/japan-dv-ac > cli-test-results/20260915-170224-uvp4/10G/rg_repre.txt
  ✅ 置換 -E $1 ↔ rg --passthru CLI    26.80 秒  uvp    14.08 秒  CLI/uvp=1.90 🟢       167,126 件  exit=0  全文をバイト一致で比較(件数は置換した箇所)
  $ LC_ALL=C sed -E 's/v="(bus_stop|traffic_signals)"/v="X_\1"/g' osm/japan-dv-ac > cli-test-results/20260915-170224-uvp4/10G/sed_repre.txt
  ✅ 置換 -E $1 ↔ sed -E    CLI    78.36 秒  uvp    14.08 秒  CLI/uvp=5.57 🟢       167,126 件  exit=0  全文をバイト一致で比較

== 置換 50G: osm/japan-latest.osm
  $ uvp osm/japan-latest.osm '東京' -replace TOKYO -out cli-test-results/20260915-170224-uvp4/50G/uvp_rep.txt
  $ rg -N -F --passthru '東京' -r TOKYO osm/japan-latest.osm > cli-test-results/20260915-170224-uvp4/50G/rg_rep.txt
  ✅ 置換 -replace ↔ rg --passthru CLI   146.65 秒  uvp    69.75 秒  CLI/uvp=2.10 🟢        95,328 件  exit=0  全文をバイト一致で比較(件数は置換した箇所)
  $ LC_ALL=C sed 's/東京/TOKYO/g' osm/japan-latest.osm > cli-test-results/20260915-170224-uvp4/50G/sed_rep.txt
  ✅ 置換 -replace ↔ sed s///g CLI   187.74 秒  uvp    69.75 秒  CLI/uvp=2.69 🟢        95,328 件  exit=0  全文をバイト一致で比較
  $ uvp osm/japan-latest.osm 'v="(bus_stop|traffic_signals)"' -E -replace 'v="X_$1"' -out cli-test-results/20260915-170224-uvp4/50G/uvp_repre.txt
  $ rg -N --passthru 'v="(bus_stop|traffic_signals)"' -r 'v="X_$1"' osm/japan-latest.osm > cli-test-results/20260915-170224-uvp4/50G/rg_repre.txt
  ✅ 置換 -E $1 ↔ rg --passthru CLI   132.74 秒  uvp    69.95 秒  CLI/uvp=1.90 🟢       602,805 件  exit=0  全文をバイト一致で比較(件数は置換した箇所)
  $ LC_ALL=C sed -E 's/v="(bus_stop|traffic_signals)"/v="X_\1"/g' osm/japan-latest.osm > cli-test-results/20260915-170224-uvp4/50G/sed_repre.txt
  ✅ 置換 -E $1 ↔ sed -E    CLI   405.52 秒  uvp    69.95 秒  CLI/uvp=5.80 🟢       602,805 件  exit=0  全文をバイト一致で比較

================================================================
一致: 81 件    不一致: 0 件    参考: 6 件
結果: /Volumes/BIWIN/26work/UwViewData/cli-test-results/20260915-170224-uvp4/summary.md
y4u@MacBook-Air UwViewData % uvp --help
Usage:
  uvp <file> <term> [stages…] [options]          investigate (flag syntax)
  uvp <file> '<term> | sort … | uniq …'          investigate (quoted pipe syntax, same meaning)
  uvp convert <file> [-out x.uwvz]               build the .uwvz
  uvp cat <file> [-out …]                        print the text
  uvp <file.uwvz> -extract [txt|gz|zip]          restore the original (free)
  uvp <file> <term> -replace <text>              print the whole text with matches replaced (sed 's/A/B/g'; Edit license)
  uvp -open [<file>]                             launch the app (and open the file if given)

Stages (run in the order written):
  <term> / -grep <term>  search. Later searches look only within ±N of the previous stage (drill-down)
    -i ignore case  -E regex  -w whole word  -v exclude (2nd stage on)  -C N context lines
  -uniq <key>            tally (key = first capture group of a regex)
  -sort <key>            sort (lines by key / after -uniq by count or value)
  -seq a,b,c             flows where a→b→c appear in that order
  -head N / -tail N      first / last N

Options:
  -out <file>            output file (.gz / .zip are compressed; anything else is text)
  -limit N               max hits kept per search (default: the app setting, initially 1,000,000;
                         0 or none = unlimited. Memory grows with the hit count, so write large results with -out)
  -replace <text>        print the whole text with every match of the term (-i -E -w allowed) replaced.
                         The file itself is not changed. The text is literal; with -E, $1 etc. insert groups ($$ = $)
  --force                overwrite an existing output file
  --no-line-number       omit line numbers
  --csv / --json         format for tally results
  -open                  at the start: run in the app / at the end: run, then also open in the app

Exit codes: 0=found 1=not found 2=error

比率が出た項目の合計(アイキャッチのグラフ)

ログの中で CLI/uvp= に数値が出た項目(CLI 側にも同じ仕事のコマンドがあり、両方の秒が取れたもの)だけを集めて、サイズごとに合計しました。置換の 4 行は同じ uvp の実行を rg と sed の両方に当てているので、uvp の秒は 1 回分だけ数えています。

全 21 項目(検索・集計・出力 17 + 置換 4。CLI は rg と sed)

サイズ CLI 合計 uvp 合計 CLI/uvp
3GB 73.63 秒 25.27 秒 2.9
10GB 343.19 秒 64.19 秒 5.3
50GB 1,833.33 秒 320.54 秒 5.7

sed の項目を除いた 18 項目(CLI は rg のみ)

サイズ rg 合計 uvp 合計 rg/uvp
3GB 24.27 秒 24.52 秒 1.0
10GB 224.31 秒 62.38 秒 3.6
50GB 1,134.32 秒 308.23 秒 3.7

アイキャッチの上段が全 21 項目、下段が rg のみの 18 項目です。uvp はいずれも既存の .uwvz を再利用した数字で、初回の .uwvz 作成(3GB 1.1 秒・10GB 11.8 秒・50GB 59.6 秒)は含んでいません。

rg / uvp の比率が出ない項目

ログで CLI/uvp=- になっている項目です。各サイズに 8 項目ずつあります。

項目 理由(ログの備考のとおり)
絞り込み -grep 記法 2 語を並べた形と同じ結果になるかの確認。CLI 側は 2 語の行で計測済み
±3 行の中に 2 語目 -C CLI に同じ意味の 1 コマンドが無い(rg -C は文脈を出すだけ)
順序 -seq CLI に相当機能なし(awk の状態機械が要る)
.uwvz だけで検索 元ファイルを見ずに .uwvz から検索。CLI に相当なし
-extract 元ファイルとの cmp のみ。gzip -dc とは形式が違うため時間は比べていない
cat 元ファイルとの cmp のみ
見つからない → exit 1 終了コードの確認
-limit 1000 uvp 固有の上限指定

一致 81 件・不一致 0 件・参考 6 件の内訳は、ログ末尾の集計行のとおりです。


関連記事

タイトルとURLをコピーしました