我有一个包含许多行的 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