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

Shell脚本中YYYYMMDDHH格式日期4位年转2位年问题求助

问题原因
  • 循环内的awk命令未传入当前处理行的内容,awk默认会读取标准输入的全部内容(即整个file.txt文件流),第一轮循环时awk就把文件内容全部读完,导致while循环直接终止,所有输出行都复用了第一行计算得到的日期值。
  • 原有printf的格式符%10s会给8位的日期补前置空格,和预期输出格式不符。
  • 额外的冗余问题:在shell循环中反复调用awk处理单行内容,执行效率极低。
修正方案

方案1:最小改动适配原有逻辑

给循环内的awk传入当前行内容,同时修改格式控制符:

while read -r x;do
yy=$(echo "$x" | awk '{print substr($0,3,2)}')
mm=$(echo "$x" | awk '{print substr($0,5,2)}')
dd=$(echo "$x" | awk '{print substr($0,7,2)}')
hh=$(echo "$x" | awk '{print substr($0,9,2)}')
echo "$x" | awk '{printf "%s %s %s\n",'$yy$mm$dd$hh',$2,$3}'
done < file.txt

方案2:最优实现(单awk命令完成所有处理)

不需要嵌套shell循环,直接用awk处理整个文件,一行即可完成需求:

awk '{print substr($1,3) " " $2 " " $3}' file.txt

该命令直接对第一列做字符串截取,从第3位取到末尾,刚好得到YYMMDDHH格式的日期,拼接后续两列输出即可完全匹配预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:15:04