如何格式化 CSV 文件中的时间戳列?
How can I format the timestamp column in a CSV file?
我正在尝试将 CSV 的第一列(以毫秒为单位的 unix 时间戳)格式化为如下命令的格式:
date -d @$( echo "($line_date + 500) / 1000" | bc)
其中 $line_date 类似于 1487693882310
我的文件中有这样的信息:
1487152859086,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,,
1487613634268,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,,
1487614351573,,,,,,spadmin,logout,,,,,,,, ,,,,
1487614500536,,,,,,System,run,Perform Maintenance,,,,,,, ,,,,
我希望它是这样的:
mié feb 15 11:00:59 CET 2017,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,,
lun feb 20 19:00:34 CET 2017,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,,
lun feb 20 19:12:32 CET 2017,,,,,,spadmin,logout,,,,,,,, ,,,,
lun feb 20 19:15:01 CET 2017,,,,,,System,run,Perform Maintenance,,,,,,, ,,,,
我试过了,但没用:
awk 'BEGIN{FS=OFS=","}{=`date -d @$( echo "($date_now + 500) / 1000" | bc)\`}1' file.csv
我们将不胜感激任何帮助。
非常感谢你。
亲切的问候。
赫克托
一种方法是保持 CSV 行不变,并在其前面添加已解析的时间戳作为第一列。
类似于:
gawk -F, '{ printf "%s.%03u,",strftime("%Y-%m-%dT%H:%M:%S", /1000),%1000; print }' file.csv
输出:
2017-02-15T10:00:59.086,1487152859086,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,,
2017-02-20T18:00:34.268,1487613634268,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,,
2017-02-20T18:12:31.573,1487614351573,,,,,,spadmin,logout,,,,,,,, ,,,,
2017-02-20T18:15:00.536,1487614500536,,,,,,System,run,Perform Maintenance,,,,,,, ,,,,
或者您可以重建第一个字段,然后像这样打印整个记录:
echo 1487152859086,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,, | awk 'BEGIN{OFS=FS=","}{=strftime("%a %b %d %H:%M:%S %Z %Y", )}1'
你会得到这个:
Fri Dec 13 14:45:52 CSTM 1901,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,,
我正在尝试将 CSV 的第一列(以毫秒为单位的 unix 时间戳)格式化为如下命令的格式:
date -d @$( echo "($line_date + 500) / 1000" | bc)
其中 $line_date 类似于 1487693882310
我的文件中有这样的信息:
1487152859086,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,,
1487613634268,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,,
1487614351573,,,,,,spadmin,logout,,,,,,,, ,,,,
1487614500536,,,,,,System,run,Perform Maintenance,,,,,,, ,,,,
我希望它是这样的:
mié feb 15 11:00:59 CET 2017,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,,
lun feb 20 19:00:34 CET 2017,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,,
lun feb 20 19:12:32 CET 2017,,,,,,spadmin,logout,,,,,,,, ,,,,
lun feb 20 19:15:01 CET 2017,,,,,,System,run,Perform Maintenance,,,,,,, ,,,,
我试过了,但没用:
awk 'BEGIN{FS=OFS=","}{=`date -d @$( echo "($date_now + 500) / 1000" | bc)\`}1' file.csv
我们将不胜感激任何帮助。
非常感谢你。
亲切的问候。
赫克托
一种方法是保持 CSV 行不变,并在其前面添加已解析的时间戳作为第一列。
类似于:
gawk -F, '{ printf "%s.%03u,",strftime("%Y-%m-%dT%H:%M:%S", /1000),%1000; print }' file.csv
输出:
2017-02-15T10:00:59.086,1487152859086,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,,
2017-02-20T18:00:34.268,1487613634268,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,,
2017-02-20T18:12:31.573,1487614351573,,,,,,spadmin,logout,,,,,,,, ,,,,
2017-02-20T18:15:00.536,1487614500536,,,,,,System,run,Perform Maintenance,,,,,,, ,,,,
或者您可以重建第一个字段,然后像这样打印整个记录:
echo 1487152859086,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,, | awk 'BEGIN{OFS=FS=","}{=strftime("%a %b %d %H:%M:%S %Z %Y", )}1'
你会得到这个:
Fri Dec 13 14:45:52 CSTM 1901,,,,,,localhost.localdomain,ServerUpDown,ServerUp,,,,,,, ,,,,