Linux:指定ディレクトリ内のCSV・テキストをマージするコマンド

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つの年間売上データにマージ

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