如何用Shell命令处理CSV日期数据,实现星期转换与班次划分?
日期格式化与班次判断实现方案
核心实现逻辑
- 跳过CSV第一行表头,逐行读取原始时间字符串
- 调用
date命令分别提取目标格式的日期串、星期全称、当前时间的小时、分钟字段 - 班次判定阈值:7:30对应当日0点起累计450分钟,19:30对应累计1170分钟,累计分钟数落在
[450, 1170)区间标记为Morning,其余时间标记为Night - 用
printf做列对齐,匹配要求的输出格式
完整可执行脚本
#!/bin/bash # 打印表头 printf "%-20s| %-12s| %s\n" "date" "Weekday" "Shift" printf -- "--------------------------------------------------------------\n" # 逐行处理日期数据,跳过第一行表头,把dates.csv替换为你的实际CSV文件路径 tail -n +2 dates.csv | while read -r dt; do # 生成dd-mm-yyyy HH:MM格式的日期字符串 fmt_date=$(date -d "$dt" +"%d-%m-%Y %H:%M") # 提取星期全称 weekday=$(date -d "$dt" +"%A") # 计算当日0点到当前时间的累计分钟数(bash原生算术,无额外依赖) h=$(date -d "$dt" +"%H") m=$(date -d "$dt" +"%M") cur_min=$((10#$h * 60 + 10#$m)) # 判断班次 if [ $cur_min -ge 450 ] && [ $cur_min -lt 1170 ]; then shift_tag="Morning" else shift_tag="Night" fi # 格式化输出单行结果 printf "%-20s| %-12s| %s\n" "$fmt_date" "$weekday" "$shift_tag" done
说明:脚本中
10#前缀用于强制把小时、分钟值按十进制解析,避免0开头的数字被bash识别为八进制引发计算错误。如果你的输入源不是本地CSV文件,直接把tail -n +2 dates.csv替换为对应的输入流即可。
运行输出结果
脚本执行后输出内容和预期完全一致:
date | Weekday | Shift -------------------------------------------------------------- 09-06-2022 22:30 | Thursday | Night 10-06-2022 15:55 | Friday | Morning 11-06-2022 00:34 | Saturday | Night 11-06-2022 19:51 | Saturday | Night 13-06-2022 11:34 | Monday | Morning 15-06-2022 03:59 | Wednesday | Night 18-06-2022 16:13 | Saturday | Morning 19-06-2022 00:24 | Sunday | Night 19-06-2022 00:25 | Sunday | Night 19-06-2022 00:25 | Sunday | Night 19-06-2022 00:25 | Sunday | Night
内容的提问来源于stack exchange,提问作者SRash
相关产品推荐
相关产品推荐

