使用Bash脚本处理CSV:按时间标记时段并填充空值
Bash脚本处理CSV文件需求方案
需求说明
需要对CSV文件完成以下处理:
- 提取时间字段的小时,若小时处于10~17区间(含10,不含18)则标记为
morning,其余情况标记为night - 将ID列的空值替换为
LOADING - 新增
session列,输出处理后的完整CSV
输入示例
time,id 2022-08-01T00:09:14+09:00,PKA990 2022-08-01T06:48:24+09:00,PKA990 2022-08-01T08:27:23+09:00, 2022-08-01T11:04:18+09:00,ABCD890 2022-08-01T11:23:22+09:00,ABCD890 2022-08-01T11:30:14+09:00, 2022-08-01T12:01:12+09:00,ABCD890 2022-08-01T15:11:59+09:00,JIKOPL8 2022-08-01T18:20:53+09:00,TUVNDGD
期望输出
time,id,session 2022-08-01T00:09:14+09:00,PKA990,night 2022-08-01T06:48:24+09:00,PKA990,night 2022-08-01T08:27:23+09:00,LOADING,night 2022-08-01T11:04:18+09:00,ABCD890,morning 2022-08-01T11:23:22+09:00,ABCD890,morning 2022-08-01T11:30:14+09:00,LOADING,morning 2022-08-01T12:01:12+09:00,ABCD890,morning 2022-08-01T15:11:59+09:00,JIKOPL8,morning 2022-08-01T18:20:53+09:00,TUVNDGD,night
可行的Bash脚本方案
使用awk工具可高效实现需求,脚本如下:
awk -F ',' ' BEGIN {OFS = ","} NR == 1 {print $0, "session"; next} { # 替换ID列空值 id = ($2 == "") ? "LOADING" : $2 # 从时间字段提取小时 split($1, time_parts, /[T:+]/) hour = time_parts[2] # 判断session类型 session = (hour >= 10 && hour < 18) ? "morning" : "night" # 输出处理后的行 print $1, id, session }' input.csv > output.csv
脚本说明
- BEGIN块:设置输出字段分隔符为逗号,保证输出格式符合CSV规范
- 表头处理:第一行直接追加
session字段后输出 - ID列处理:判断第二列是否为空,空值替换为
LOADING,非空则保留原值 - 小时提取:通过
split函数按T、:、+分割时间字符串,取出小时部分 - session判断:严格匹配示例逻辑,小时在10~17区间标记为
morning,其余为night - 输出:将处理后的字段组合输出到目标文件
使用时将input.csv替换为你的实际输入文件名,处理结果会保存到output.csv中。
内容的提问来源于stack exchange,提问作者user9300309
相关产品推荐
相关产品推荐

