编写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
脚本说明
- 表头处理:直接用
head -n1输出原始文件的表头,不需要修改。 - 日期格式转换:原始日期是
DD/Mon/YY,我们需要把它转成date命令能识别的Mon DD YYYY格式(比如14/Dec/17→Dec 14 2017)。 - Epoch时间计算:把日期转成时间戳(秒数),方便我们逐天累加计算。
- 工作日判断循环:
- 每次累加一天的秒数,然后用
date +%u判断当前日期是星期几(1-5是工作日)。 - 只有遇到工作日时,才计数一次,直到累计满2个工作日。
- 每次累加一天的秒数,然后用
- 格式还原:把最终的时间戳转回
DD/Mon/YY格式,并用sed把月份缩写的首字母改成大写(匹配你给出的输出格式)。
使用方法
- 把上述脚本保存为
add_workdays.sh。 - 给脚本添加执行权限:
chmod +x add_workdays.sh。 - 运行脚本:
./add_workdays.sh,就能得到你想要的输出啦!
内容的提问来源于stack exchange,提问作者Amit Singh
相关产品推荐
相关产品推荐

