如何通过Shell命令为含Epoch时间的数据追加人类可读日期列?
为包含Epoch时间戳的行追加人类可读日期的最简方法
我有如下格式的数据:
1234567890.123 'time1' 2345678901.234 'time2' 3456789012.345 'time3'其中第一个数字为Epoch时间戳,我希望为每行追加一列人类可读的日期。我尝试过类似
cut -c 1-10 | xargs -I {} date -r {}的命令,但该方法无法保留行内其他数据。请问实现此需求的最简方式是什么?
最简解决方案:使用awk处理
最简单的方式是借助awk工具——它能在处理每行数据时,同时完成时间戳转换和原内容保留,不用拆分再拼接,一步到位。
通用版本(兼容多数系统)
如果你的系统date命令不支持内置时间戳转换,或者你想要更灵活的外部命令调用,用这条命令:
awk '{ ts = int($1) cmd = "date -r " ts cmd | getline human_date close(cmd) print $0, human_date }' your_input_file
逻辑拆解:
ts = int($1):提取第一个字段的整数部分(忽略Epoch时间戳的小数位,date只需要整秒数)cmd = "date -r " ts:构造调用date命令的字符串cmd | getline human_date:执行命令并读取输出到变量close(cmd):关闭命令管道,避免资源占用print $0, human_date:打印原行所有内容,再追加转换后的日期
高效简化版(GNU环境适用)
如果你用的是GNU awk(大部分Linux系统默认是这个),可以直接用内置的日期函数,不用调用外部date命令,速度更快:
awk '{print $0, strftime("%Y-%m-%d %H:%M:%S", int($1))}' your_input_file
strftime("%Y-%m-%d %H:%M:%S", int($1)):内置函数直接把整数时间戳转成指定格式的日期,你可以把%Y-%m-%d %H:%M:%S换成%c(系统默认可读格式)或者其他你需要的格式。
示例输出
用简化版命令处理你的示例数据,会得到:
1234567890.123 'time1' 2345678901.234 'time2' 3456789012.345 'time3' 2009-02-18 03:31:30
内容的提问来源于stack exchange,提问作者cohoz
相关产品推荐
相关产品推荐

