使用 shell 添加 csv 文件的日期时间列以及以秒为单位的时间列

使用 shell 添加 csv 文件的日期时间列以及以秒为单位的时间列

我有一个包含许多行的 csv 文件,其标题是:

   DateTime,CallEndTime,KeywordTagTexts,TotalDuration

标题键的位置发生变化,因此我使用 sed 计算了位置

duration=$(sed -n $'1s/,/\\\n/gp' rawfile.csv | grep -nx 'TotalDuration' | cut -d: -f1);
callend=$(sed -n $'1s/,/\\\n/gp' rawfile.csv | grep -nx 'CallEndTime' | cut -d: -f1);
callstart=$(sed -n $'1s/,/\\\n/gp' rawfile.csv | grep -nx 'DateTime' | cut -d: -f1);

DateTime 中的值为日期时间格式的“2018-12-18 18:36:55”,TotalDuration 的单位为秒。

我想将值 DateTime + TotalDuration 添加到 CallEndTime,

答案1

这个想法是首先转换为纪元时间(自 1970-01-01 00:00:00 UTC 以来的秒数),然后添加持续时间,最后转换回之前的表示法:

DateTime_epoch_time=$(date +%s -d $DateTime) 
CallEndTime_epoch_time=$(("$DateTime_epoch_time" + $TotalDuration))
CallEndTime=$(date '+%Y-%m-%d %H:%M:%S' -d @$CallEndTime_epoch_time)

或者在一行中:

date '+%Y-%m-%d %H:%M:%S' -d @$(($(date +%s -d "$DateTime") + $TotalDuration))

有关日期格式操作的更多详细信息,请参阅授权

答案2

例如,我将总持续时间值设为 1000

以下是我采用的示例格式,这是您在上一栏之外发布的示例

2018-12-18 18:36:55,callendtime,KeywordTagTexts,1000

如有任何更正或更改,请发表评论

步骤1

转换列 1(日期时间,以秒为单位)

datetime_in_seconds=$(date -d "`awk -F "," '{print $1}' example.txt`" +%s)

第2步

添加 Column1(日期时间)和最后一列(总持续时间)来计算 CallEndTime

k=$((datetime_in_seconds + duration_in_seconds))

现在以原始格式打印值

最终命令

awk -F "," -v k="$k"  'OFS=","{$2=$2"="k;print $0}' example.txt

输出

2018-12-18 18:36:55,callendtime=1545188015,KeywordTagTexts,1000

相关内容