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
相关产品推荐
相关产品推荐

