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?

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

Last updated at Posted at 2024-12-11

タイムテーブルマージ処理メモ
動作未確認のため、使用する場合は注意してください。
ーーー
やりたいこと
こんな感じの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がないと昇順
動いてほしい

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?