0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

jq・awk・pandas使い分け→統一CLIツールで作業時間60%短縮してみた

Posted at

はじめに

「このデータ、どのツールで処理すれば...」

データ形式を見るたびに、頭の中でツール選択が始まる日々。JSONならjq、CSVならawk、統計ならpandas...。気づけば机の上にはツール別のチートシートが散乱。

そんな 「ツール使い分け疲れ」 を解決するために、統一構文で全データ形式を処理できるCLIツール「hawk」を開発・導入してみました。結果、作業時間を60%短縮できたので、その経緯と効果を共有します。

使い分け地獄の実態

パターン1: JSON処理の場合

AWS CLI出力の分析

aws ec2 describe-instances --instance-ids i-1234567890abcdef0 > instances.json

# インスタンス状態確認のために...
jq '.Reservations[0].Instances[0].State.Name' instances.json

毎回のパターン:

  1. JSONの構造をlessでスクロール確認(2分)
  2. jqの構文をググって確認(1分)
  3. 実際のクエリ作成・実行(2分)
    → 合計5分/回

パターン2: CSV処理の場合

売上データの統計処理

# 特定条件の抽出
awk -F',' '$3 > 1000 {print $0}' sales.csv

# 平均値の計算
awk -F',' '{sum+=$3; count++} END {print sum/count}' sales.csv

毎回のパターン:

  1. CSVの列構造を確認(1分)
  2. awkの構文を思い出す/調べる(2分)
  3. フィールド番号を間違えて再実行(1分)
    → 合計4分/回

パターン3: 統計分析の場合

ちょっとした中央値計算

import pandas as pd
df = pd.read_csv('data.csv')
print(df['value'].median())

毎回のパターン:

  1. Pythonスクリプトファイル作成(1分)
  2. pandas import、データ読み込み(1分)
  3. 実行環境の準備(1分)
    → 合計3分/回

日常業務での実測データ

導入前の作業時間(1日あたり)

作業内容 頻度/日 時間/回 合計時間
AWS CLI JSON解析 8回 5分 40分
ログファイル分析 6回 3分 18分
CSV データ処理 4回 4分 16分
統計計算 2回 3分 6分
合計 20回 平均4分 80分

月間: 約26時間 の作業時間

hawkとは?統一構文ですべてを処理

「hawk」は、JSON・YAML・CSV・テキストファイルを同じ構文で処理できるCLIツールです。

基本コンセプト

  • 統一インターフェース: 形式問わず同じクエリ言語
  • pandas風操作: 直感的で覚えやすい構文
  • 軽量・高速: Rust製で瞬時に起動
  • シングルバイナリ: 依存関係なし、簡単インストール

hawkの世界観

# どのデータ形式でも同じ書き方
hawk '.[] | select(.age > 30) | group_by(.department) | count' data.json
hawk '.[] | select(.age > 30) | group_by(.department) | count' data.csv  
hawk '.[] | select(.age > 30) | group_by(.department) | count' data.yaml

これが「ツール使い分け地獄」からの解放です。

hawkによる統一解決策

同じ構文で全形式対応

JSON処理

# AWS CLI出力の分析
aws ec2 describe-instances | hawk '.Reservations[0].Instances[0].State'
# Code  Name
# 16    running

CSV処理

# 売上データ分析(同じ構文!)
hawk '.[] | select(.price > 1000) | avg(.price)' sales.csv

ログ処理(テキストファイル対応)

# エラーログ抽出(grep不要)
hawk '. | select(. | contains("ERROR"))' app.log

統計処理

# 中央値計算(同じ構文!)
hawk '.[] | median(.value)' data.csv

効果測定:導入後の劇的変化

導入後の作業時間(1日あたり)

作業内容 頻度/日 時間/回 合計時間 短縮率
統一データ処理 20回 1.5分 30分 62.5%短縮

月間: 約10時間 の作業時間(16時間短縮

短縮要因の分析

1. ツール選択時間の削減

  • Before: 「どのツールを使うか?」で毎回30秒
  • After: hawk一択で思考時間ゼロ
  • 効果: 10分/日短縮

2. 構文学習時間の削減

  • Before: ツール別にチートシート確認
  • After: 統一構文で暗記済み
  • 効果: 20分/日短縮

3. 環境準備時間の削減

  • Before: Python起動、ファイル作成等
  • After: CLI一発実行
  • 効果: 15分/日短縮

4. エラー修正時間の削減

  • Before: ツール別の「罠」にハマる
  • After: 一貫したエラーメッセージ
  • 効果: 5分/日短縮

具体的な使用例と効果

ケース1: AWS環境の監視業務

Before: 複数コマンド組み合わせ

# EC2インスタンス状態確認
aws ec2 describe-instances | jq '.Reservations[].Instances[].State.Name'

# セキュリティグループ確認  
aws ec2 describe-instances | jq '.Reservations[].Instances[].SecurityGroups[].GroupName'

# 統計取得(手動計算)

After: 統一インターフェース

# インスタンス状態確認
aws ec2 describe-instances | hawk '.Reservations[].Instances[].State.Name'

# セキュリティグループ確認
aws ec2 describe-instances | hawk '.Reservations[].Instances[].SecurityGroups[0].GroupName'

# 統計取得
aws ec2 describe-instances | hawk '.Reservations[].Instances[] | group_by(.InstanceType) | count'

効果: 作業時間 15分 → 5分(67%短縮)

ケース2: ログ分析業務

Before: grep + awk + sort

grep "ERROR" app.log
grep "ERROR" app.log | awk '{print $1, $2}'
grep "ERROR" app.log | awk '{print $1}' | sort | uniq -c

After: hawk統一処理

# エラー抽出
hawk '. | select(. | contains("ERROR"))' app.log

# 時刻別集計
hawk '. | select(. | contains("ERROR")) | count' app.log

効果: 作業時間 8分 → 2分(75%短縮)

ケース3: データ分析業務

Before: pandas準備

# ファイル作成: analysis.py
import pandas as pd
df = pd.read_csv('sales.csv')
result = df.groupby('region')['amount'].median()
print(result)
# 実行: python analysis.py

After: CLI一発

hawk '.[] | group_by(.region) | median(.amount)' sales.csv

効果: 作業時間 5分 → 30秒(90%短縮)

hawkの主要機能

構造化データ + テキストファイル対応

JSON・YAML・CSV処理

# 構造確認(lessでのスクロール不要)
hawk '. | info' data.json

# 条件絞り込み
hawk '.users[] | select(.age > 30)' users.json
hawk '.[] | select(.age > 30)' users.csv
hawk '.users[] | select(.age > 30)' users.yaml

ログ解析の統一化

# システムログ、アプリログ、アクセスログすべて同じ構文
hawk '. | select(. | contains("ERROR"))' system.log
hawk '. | select(. | contains("ERROR"))' app.log  
hawk '. | select(. | contains("500"))' access.log

直感的な文字列操作

データクリーニング作業

# メール正規化(sed, awk不要)
hawk '.[] | map(.email | lower | trim)' users.csv

# ファイル名変換(複雑な正規表現不要)
hawk '. | map(. | replace("_", "-"))' filenames.txt

# 大文字変換・空白除去
hawk '. | map(. | upper | trim)' names.txt

統計・集計機能

高度な分析もCLI一発

# 基本統計(pandas不要)
hawk '.[] | avg(.price)' products.csv
hawk '.[] | median(.score)' results.csv
hawk '.[] | stddev(.value)' measurements.csv

# データ整理
hawk '.[] | unique(.category)' items.csv
hawk '.[] | sort(.timestamp)' events.csv

# グループ集計
hawk '.[] | group_by(.region) | count' sales.csv
hawk '.[] | group_by(.department) | avg(.salary)' employees.csv

導入時の工夫とポイント

段階的移行戦略

Week 1: JSON処理のみhawkに移行

  • 既存のjqクエリをhawk構文に変換
  • 基本的なフィールドアクセスから習得

Week 2: CSV処理を追加

  • awkからの移行
  • 統計関数の活用開始

Week 3: ログ処理を統合

  • grepからの完全移行
  • 文字列操作の習得

Week 4: 全面運用開始

  • 全データ形式でhawk使用
  • 効果測定開始

チーム展開での配慮

学習コスト最小化

  • 統一構文による覚えやすさ
  • pandas風の直感的操作
  • 既存知識の活用可能

導入ハードル低減

  • シングルバイナリで簡単インストール
  • 既存ワークフローとの互換性
  • 段階的移行が可能

副次的効果:予想外のメリット

メンタル負荷の軽減

Before: データを見るたびに「どのツール?」の判断疲れ
After: 常にhawkで統一された思考プロセス

スキル習得の効率化

Before: ツール別に個別学習が必要
After: 一つの構文習得で全対応

エラー削減

Before: ツール固有の罠(jqの.の有無、awkのフィールド番号等)
After: 一貫した構文でタイプミス激減

費用対効果分析

開発・導入コスト

  • ツール開発: 個人プロジェクト(コストなし)
  • 学習時間: 約4時間(既存スキル活用)
  • 移行時間: 約8時間(段階的実施)

効果

  • 月間時間短縮: 16時間
  • 年間効果: 192時間(約24営業日相当)
  • 精神的負担軽減: プライスレス

ROI: 初月からプラス転換達成

今後の展開

個人レベル

  • より複雑なデータパイプライン構築
  • 自動化スクリプトでの活用
  • 新機能の積極活用

チームレベル

  • 運用手順書への組み込み
  • 新人教育での統一ツール採用
  • ナレッジ共有の促進

まとめ

hawk v0.2.0の導入により、作業時間60%短縮を実現できました。

定量的効果:

  • 日常作業時間: 80分 → 30分
  • 月間節約時間: 16時間
  • 年間効果: 約24営業日相当

定性的効果:

  • ツール選択の判断疲れ解消
  • 学習コストの大幅削減
  • エラー・ミスの激減

最大の収穫: 「どのツールを使うか?」から「どうデータを分析するか?」に思考をシフトできたこと。

同じような「ツール使い分け疲れ」を感じている方は、ぜひ一度試してみてください。

リンク

すぐに試せる例

# インストール
brew install kyotalab/tools/hawk

# サンプルデータで効果を体験
cat << 'EOF' > sample.csv
name,age,department,salary
Alice,30,Engineering,80000
Bob,25,Marketing,60000
Carol,35,Engineering,95000
EOF

# 統計分析(pandas不要)
hawk '.[] | avg(.salary)' sample.csv
hawk '.[] | group_by(.department) | count' sample.csv

# JSON処理(jq不要)
echo '{"users":[{"name":"Alice","age":30},{"name":"Bob","age":25}]}' | hawk '.users[] | select(.age > 25)'

この記事が作業効率化の参考になりましたら、いいね👍やストック📚をお願いします!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?