![Bash 脚本将 csv 文件中的第二列从 Unix 时间转换为可读的日期/时间](https://linux22.com/image/116035/Bash%20%E8%84%9A%E6%9C%AC%E5%B0%86%20csv%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E7%AC%AC%E4%BA%8C%E5%88%97%E4%BB%8E%20Unix%20%E6%97%B6%E9%97%B4%E8%BD%AC%E6%8D%A2%E4%B8%BA%E5%8F%AF%E8%AF%BB%E7%9A%84%E6%97%A5%E6%9C%9F%2F%E6%97%B6%E9%97%B4.png)
我的输入文件是逗号分隔的 .csv。我想将第二列从 unix 时间转换为可读的日期时间格式,如下所示......
before 1502280000
after 8/10/17 08:00:00
我还想忽略第一行,因为它是标题。
我在 Solaris 10 上的 bash shell 中运行
我的 csv 的前两行看起来像这样
HOST,DATE_TIME_CREATED,USER_ID,EVENT_CLASS
xxxx,1502286180,xxxx,xxxx
xxxx,1502280347,xxxx,xxxx
寻找输出
HOST,DATE_TIME_CREATED,USER_ID,EVENT_CLASS
xxxx,Wed Aug 9 09:43:00 EDT 2017,xxxx,xxxx
xxxx,Wed Aug 9 08:05:47 EDT 2017,xxxx,xxxx
答案1
我强烈推荐时间格式 YYYY-mm-dd HH:MM:SS ——该格式明确,并且按词汇和时间顺序排序。
您可以使用 perl 来实现此目的:
perl -MPOSIX=strftime -F, -ane '
$F[1] = strftime("%F %T", localtime $F[1]) if $. > 1;
print join ",", @F
' file
答案2
该awk
方法:
awk -F, 'NR>1{printf"%s,",$1;
system("printf \"$(date -d @"$2")\"");printf",%s,%s\n",$3,$4}
' infile.txt
HOST,DATE_TIME_CREATED,USER_ID,EVENT_CLASS
xxxx,Wed Aug 9 09:43:00 EDT 2017,xxxx,xxxx
xxxx,Wed Aug 9 08:05:47 EDT 2017,xxxx,xxxx
答案3
使用 Miller( mlr
) 来格式化 Unix 时间戳strftime_local()
。请注意,生成的时间+日期是本地时区:
$ mlr --csv put '$DATE_TIME_CREATED = strftime_local($DATE_TIME_CREATED,"%c")' file
HOST,DATE_TIME_CREATED,USER_ID,EVENT_CLASS
xxxx,Wed Aug 9 13:43:00 2017,xxxx,xxxx
xxxx,Wed Aug 9 12:05:47 2017,xxxx,xxxx
请参阅strftime(3)
系统手册以了解可以使用的格式字符串。%c
格式“由国家时间和日期表示法替换”。