You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:18:49