Bash 脚本将 csv 文件中的第二列从 Unix 时间转换为可读的日期/时间

Bash 脚本将 csv 文件中的第二列从 Unix 时间转换为可读的日期/时间

我的输入文件是逗号分隔的 .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格式“由国家时间和日期表示法替换”。

相关内容