シェルを使用してcsvファイルに日付/時刻列と時刻列(秒)を追加する

シェルを使用して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の単位は秒です。

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

関連情報