1. ヘッダーありCSVをマージ(2番目以降のヘッダーは除去)
各子ディレクトリ内にあるCSVファイルを結合。1番目のファイルのヘッダー(1行目)だけを残し、2番目以降のファイルのヘッダーは自動的にスキップして1つのファイルに出力します。
awk 'FNR==1 && NR!=1 {next} {print}' */*.csv > merged_output.csv
FNR==1 && NR!=1 {next}:各ファイルの1行目(FNR==1)であり、かつ全体の通算で1行目ではない(NR!=1)場合は、その行をスキップ(next)する処理です。- データの並び順(列)がすべてのCSVファイルで完全に一致している場合に有効です。
2. ヘッダーなしCSVを古い順にソートしてマージ
元データにヘッダーがなく、先頭列に日時データ(20251102 170401819など)が入っているFXのティックデータ等に最適です。全ファイルを結合しつつ、ミリ秒単位まで自動で古い順(昇順)に並び替えて出力します。
cat */*.csv | sort > sorted_output.csv
cat */*.csv:子ディレクトリ内の全CSVファイルを読み込む| sort:先頭のタイムスタンプを基準に超高速で並び替え- 不要な中間ファイルを作らず、マージとソートを1発で同時に完結させます。
3. テキストデータから特定行だけを抽出してマージ
HistData.comのレポートなどのように、不要なコピーライト(ヘッダー)や集計結果(フッター)が含まれる複数ファイルから、必要なデータ行(例:Gap ofが含まれる行)だけを狙い撃ちで抽出して1つにまとめます。
grep "Gap of":必要なキーワードが含まれる行だけを抽出(不要なヘッダー・フッターは自動で無視される)-h:出力結果の行頭にファイル名が付くのを防ぎ、純粋なデータ行だけを結合する- データ行自体に日付(年月日時分秒)が含まれている場合、ファイル名情報がなくても後から年単位の解析が可能です。
💡 主な使用想定シーン・活用例
今回紹介したコマンドは、FXデータに限らず、以下のような大量のテキスト・CSVデータを扱う様々なシーンで応用可能。
- データ分析・バックテスト
- ・解析用のヒストリカルデータ、ティックデータのマージ(月ごと・日ごとのデータを年単位に集約)
- ・仮想通貨(暗号資産)や株価の分足・秒足データの時系列ソート結合
- サーバー運用・システム開発(インフラ・運用保守)→こんな備忘録不要な人たち
- ・日ごとにローテーション(分割)されたWebサーバー(Apache/Nginx)のアクセスログのマージ
- ・複数サーバーから集めたアプリケーションのエラーログ(
grep "ERROR"やgrep "CRITICAL")の抽出と一括管理 - ・時系列がバラバラになったシステムログ(Syslog)を、タイムスタンプ基準で綺麗な古い順(昇順)に並び替えて調査
- IoT・センサーデータの処理 →こんな備忘録不要な人たちパート2
- ・各端末(子ディレクトリごと)から送られてくる温度・湿度などの時系列センサーログの統合
- ・機器の異常値(例:
grep "Overheat")だけを全端末のログから一発で抽出してレポート作成
- マーケティング・ビジネスデータ集計
- ・ECサイトなどの日別・店舗別の売上CSV(ヘッダーあり)を、ヘッダーを排除しつつ1つの年間売上データにマージ

