ShellというかawkでタイムスケジュールをCSVをマージする

タイムテーブルマージ処理メモ
動作未確認のため、使用する場合は注意してください。
ーーー
やりたいこと
こんな感じのCSVが2つあるときに、片方を優先しつつマージしたい
例1.タイムテーブルAのCSV（優先するほう）
No,date,startTime,endTime,memo
1,241101,1632,1800,作業する

例2.タイムテーブルBのCSV（ねじ込まれるほう）
No,date,startTime,endTime,memo
1,241101,1400,1700,午後仕事A
2,241101,1700,2400,帰宅・就寝準備

例3.マージ後のCSV（No1の終了時刻とNo3の開始時刻が加工されている）
No,date,startTime,endTime,memo
1,241101,1400,1632,午後仕事
2,241101,1632,1800,作業する
3,241101,1800,2400,帰宅・就寝準備

---
```
#!/bin/bash

# コマンドライン引数のチェック
if [ "$#" -ne 3 ]; then
    echo "使用方法: $0 <time_table_A.csv> <time_table_B.csv> <output.csv>"
    exit 1
fi

# 入力ファイルと出力ファイルを指定
time_table_A="$1"
time_table_B="$2"
output_file="$3"

# ヘッダーを書き込む
echo "No,date,startTime,endTime,memo" > "$output_file"

# マージ処理
awk -F, '
BEGIN {
    OFS = ","
}

# タイムテーブルAを読み込む
FNR == NR {
    if (NR > 1) {
        # タイムテーブルAのデータを格納
        a_no = $1
        a_date = $2
        a_start = $3
        a_end = $4
        a_memo = $5
        timeTableA[a_no,a_date, a_start, a_end] = a_memo
    }
    next
}

# タイムテーブルBを処理
NR > FNR {
    if (NR > 1) {
        b_no = $1
        b_date = $2
        b_start = $3
        b_end = $4
        b_memo = $5
        adjusted_start = b_start
        adjusted_end = b_end
        skip_flag = 0

        # Aの時間と重複をチェックして調整
        for (key in timeTableA) {
            split(key, a_keys, SUBSEP)
            if (a_keys[2] == b_date) {
                a_start = a_keys[3]
                a_end = a_keys[4]

                 条件: b_start が a_start より後で、かつ b_end が a_end より前の場合は出力しない
                if (!(b_start > a_start && b_end < a_end)) {
                    skip_flag = 1
                }
                # Aの時間とBの時間が重複する場合の処理
                if (b_start < a_end && b_end > a_start) {
                    if (b_start < a_start) adjusted_end = a_start
                    if (b_end > a_end) adjusted_start = a_end
                }
            }
        }

        # 重複による調整後の時間帯が有効であれば出力
        if (adjusted_start < adjusted_end) {
            print b_no, b_date, adjusted_start, adjusted_end, b_memo >> "'"$output_file"'"
        }
    }
}

# タイムテーブルAをそのまま出力
END {
    for (key in timeTableA) {
        split(key, a_keys, SUBSEP)
        print a_keys[1], a_keys[2], a_keys[3], a_keys[4], timeTableA[key] >> "'"$output_file"'"
    }
}
' "$time_table_A" "$time_table_B"

echo "マージが完了しました: $output_file"
```
---
```
#!/bin/bash

# コマンドライン引数のチェック
if [ "$#" -ne 2 ]; then
    echo "使用方法: $0 <input.csv> <output.csv>"
    exit 1
fi

# 入力ファイルと出力ファイルを指定
input_file="$1"
output_file="$2"

# ヘッダー行を保持しつつソート処理
awk 'NR==1 {print; next}' "$input_file" > "$output_file"
awk 'NR > 1' "$input_file" | sort -t, -k2,2 -k3,3 >> "$output_file"

# AWKコマンドの終了ステータスをチェック
if [ $? -ne 0 ]; then
    echo "AWK処理中にエラーが発生しました。" >&2
    exit 1
fi
echo "ソート結果が出力されました: $output_file"
```

```
#!/bin/bash

# コマンドライン引数のチェック
if [ "$#" -ne 2 ]; then
    echo "使用方法: $0 <input.csv> <output.csv>"
    exit 1
fi

# 入力ファイルと出力ファイルを指定
input_file="$1"
output_file="$2"

# CSVの処理
awk -F, '
BEGIN {
    OFS = ","
}

NR == 1 {
    # ヘッダー行をそのまま出力
    print $0
    next
}

{
    # startTimeとendTimeを分数に変換
    start_minutes = int(substr($3, 1, 2)) * 60 + int(substr($3, 3, 2))
    end_minutes = int(substr($4, 1, 2)) * 60 + int(substr($4, 3, 2))
    
    # 分数を計算してminutes列に設定
    $5 = end_minutes - start_minutes

    # 修正後の行を出力
    print $0
}
' "$input_file" > "$output_file"

echo "修正完了: $output_file"
```
```
#!/bin/bash

# 引数のチェック
if [ "$#" -ne 2 ]; then
    echo "使用方法: $0 <yyyymmdd形式の日付> <加算日数>"
    exit 1
fi

# 入力パラメータ
input_date="$1"   # yyyymmdd形式の日付
days_to_add="$2"  # 加算する日数

# yyyymmdd形式の日付を変更
new_date=$(date -d "${input_date} +${days_to_add} days" +"%Y%m%d")

# 結果を出力
echo "変更後の日付: $new_date"
```


ソートの-k3,3を-k3,3rにすると降順、rがないと昇順
動いてほしい