如何批量将Unix时间戳转为可读格式并追加至数据列?
解决方法
原脚本的问题根源
你用echo $time时没加双引号,bash会把变量里的换行符替换成空格,三行内容合并成一行传给awk,awk只提取这一行的第2列(也就是第一个时间戳),所以循环只执行了一次。
方案一:修正原脚本(仅输出转换后的时间)
给echo的变量加上双引号,保留换行让awk逐行处理:
var=$(echo "$time" | awk -F ',' '{print $2}') for secs in $var do date -d @$secs done
但这个方案只能单独输出转换后的时间,没法追加到原行末尾,更推荐下面的方法。
方案二:用awk直接完成(推荐,一次输出目标格式)
GNU awk自带strftime函数,可直接将Unix时间戳转成可读格式,一次处理所有行:
echo "$time" | awk -F ',' -v OFS=',' '{print $0, strftime("%a %b %d %Y %r", $2)}'
参数说明:
-F ',':指定输入分隔符为逗号-v OFS=',':指定输出分隔符为逗号strftime("%a %b %d %Y %r", $2):将第2列的时间戳转换为你需要的格式(%r对应12小时制时分秒,和示例格式匹配)
执行后直接输出目标结果:
1,1708746085,apples,cars,Fri Mar 15 2024 07:37:39 PM 2,1709764378,pears,bus,Tue Mar 26 2024 02:32:58 PM 3,1709875892,orange,truck,Wed Mar 27 2024 05:31:32 PM
方案三:适配不支持strftime的awk(如BSD awk)
如果你的awk版本没有strftime,可以在awk里调用date命令获取转换结果:
echo "$time" | awk -F ',' -v OFS=',' '{ cmd = "date -d @" $2 " +\"%a %b %d %Y %r\"" cmd | getline dt close(cmd) print $0, dt }'
内容的提问来源于stack exchange,提问作者bob monty
相关产品推荐
相关产品推荐

