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

编写Unix Shell脚本:将file.txt中入职日期加2天并跳过周末

解决日期加2个工作日(跳过周末)的Shell脚本

我来帮你实现这个需求!根据你给出的输入和输出,核心是给每个入职日期增加2个工作日(自动跳过周六和周日),下面是完整的Shell脚本和详细解释:

完整脚本

#!/bin/bash

# 输出原始表头
head -n 1 file.txt

# 逐行处理数据行
tail -n +2 file.txt | while IFS=, read -r user date_str; do
    # 将DD/Mon/YY格式转换为date命令可识别的Mon DD YYYY格式
    formatted_date=$(echo "$date_str" | awk -F'/' '{printf "%s %s 20%s", $2, $1, $3}')
    
    # 将日期转换为epoch时间戳(方便计算天数)
    epoch=$(date -d "$formatted_date" +%s)
    
    added_workdays=0
    current_epoch=$epoch
    
    # 循环累加天数,直到找到第2个工作日
    while [ $added_workdays -lt 2 ]; do
        # 增加一天(86400秒=1天)
        current_epoch=$((current_epoch + 86400))
        
        # 获取当前日期的星期数:1=周一,7=周日
        weekday=$(date -d "@$current_epoch" +%u)
        
        # 如果是工作日(周一到周五),则计数+1
        if [ $weekday -le 5 ]; then
            added_workdays=$((added_workdays + 1))
        fi
    done
    
    # 将最终时间戳转换为DD/Mon/YY格式,并修正月份缩写为大写首字母
    final_date=$(date -d "@$current_epoch" +'%d/%b/%y' | sed 's/\([a-z]*\)/\u\1/')
    
    # 输出结果行
    echo "$user,$final_date"
done

脚本说明

  1. 表头处理:直接用head -n1输出原始文件的表头,不需要修改。
  2. 日期格式转换:原始日期是DD/Mon/YY,我们需要把它转成date命令能识别的Mon DD YYYY格式(比如14/Dec/17→Dec 14 2017)。
  3. Epoch时间计算:把日期转成时间戳(秒数),方便我们逐天累加计算。
  4. 工作日判断循环:
    • 每次累加一天的秒数,然后用date +%u判断当前日期是星期几(1-5是工作日)。
    • 只有遇到工作日时,才计数一次,直到累计满2个工作日。
  5. 格式还原:把最终的时间戳转回DD/Mon/YY格式,并用sed把月份缩写的首字母改成大写(匹配你给出的输出格式)。

使用方法

  1. 把上述脚本保存为add_workdays.sh。
  2. 给脚本添加执行权限:chmod +x add_workdays.sh。
  3. 运行脚本:./add_workdays.sh,就能得到你想要的输出啦!

内容的提问来源于stack exchange,提问作者Amit Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:57:23