ヘッダーが次のような行が多い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の単位は秒です。
CallEndTimeにDateTime + TotalDuration値を追加したいです。
答え1
アイデアは最初にepoch時間(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)
または1行で:
date '+%Y-%m-%d %H:%M:%S' -d @$(($(date +%s -d "$DateTime") + $TotalDuration))
日付形式の操作の詳細については、次を参照してください。承認する
答え2
たとえば、合計期間の値を 1000 に設定しました。
以下は私が使用したフォーマットの例です。これは、前の列に追加で公開された例です。
2018-12-18 18:36:55, callendtime, キーワードTagTexts, 1000
修正や変更がある場合はコメントとして残してください
ステップ1
列1変換(日付/時間(秒))
datetime_in_seconds=$(date -d "`awk -F "," '{print $1}' example.txt`" +%s)
ステップ2
CallEndTimeを計算するには、Column1(日付/時刻)と最後の列(合計期間)を追加します。
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