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