У меня есть файл CSV, он включает некоторые столбцы, в этом у меня есть время начала и время окончания. Мое требование должно получить различие между временем и добавить различие к новому столбцу.
Я получаю различие между временем, но не способный добавить его в новый столбец правильно для каждой строки.
Это - мой образец csv.
4, ganesh-28,2019-09-26T16:56:40Z, закрытый, harshavardhanc, 2019-09-26T16:57:02Z, 1,1 3, ganesh-28,2019-09-26T16:54:25Z, закрытый, harshavardhanc, 2019-09-26T16:54:55Z, 1,1 2, ganesh-28,2019-09-26T16:52:59Z, закрытый, harshavardhanc, 2019-09-26T16:55:19Z, 1,1 1, ganesh-28,2019-09-26T16:46:52Z, закрытый, harshavardhanc, 2019-09-26T16:47:25Z, 1,1
Это - сценарий.
#!/bin/bash
cat a.csv | while read line
do
created_at=$(date -d $(echo $line | awk -F "," '{print $3}') +%s)
merged_at=$(date -d $(echo $line | awk -F "," '{print $6}') +%s)
echo $created_at $merged_at
diff=$(( $merged_at - $created_at ))
h=`expr $diff / 3600`
m=`expr $diff % 3600 / 60`
s=`expr $diff % 60`
diff=$(printf "%02d:%02d:%02d\n" $h $m $s)
echo $diff
awk -v v1="$diff" -F"," 'BEGIN { OFS = "," } {$9=v1; print}' a.csv >> b.csv
done
Я получаю вывод что-то вроде этого.
4,ganesh-28,2019-09-26T16:56:40Z,closed,harshavardhanc,2019-09-26T16:57:02Z,1,1,00:00:22
3,ganesh-28,2019-09-26T16:54:25Z,closed,harshavardhanc,2019-09-26T16:54:55Z,1,1,00:00:22
2,ganesh-28,2019-09-26T16:52:59Z,closed,harshavardhanc,2019-09-26T16:55:19Z,1,1,00:00:22
1,ganesh-28,2019-09-26T16:46:52Z,closed,harshavardhanc,2019-09-26T16:47:25Z,1,1,00:00:22
4,ganesh-28,2019-09-26T16:56:40Z,closed,harshavardhanc,2019-09-26T16:57:02Z,1,1,00:00:30
3,ganesh-28,2019-09-26T16:54:25Z,closed,harshavardhanc,2019-09-26T16:54:55Z,1,1,00:00:30
2,ganesh-28,2019-09-26T16:52:59Z,closed,harshavardhanc,2019-09-26T16:55:19Z,1,1,00:00:30
1,ganesh-28,2019-09-26T16:46:52Z,closed,harshavardhanc,2019-09-26T16:47:25Z,1,1,00:00:30
4,ganesh-28,2019-09-26T16:56:40Z,closed,harshavardhanc,2019-09-26T16:57:02Z,1,1,00:02:20
3,ganesh-28,2019-09-26T16:54:25Z,closed,harshavardhanc,2019-09-26T16:54:55Z,1,1,00:02:20
2,ganesh-28,2019-09-26T16:52:59Z,closed,harshavardhanc,2019-09-26T16:55:19Z,1,1,00:02:20
1,ganesh-28,2019-09-26T16:46:52Z,closed,harshavardhanc,2019-09-26T16:47:25Z,1,1,00:02:20
4,ganesh-28,2019-09-26T16:56:40Z,closed,harshavardhanc,2019-09-26T16:57:02Z,1,1,00:00:33
3,ganesh-28,2019-09-26T16:54:25Z,closed,harshavardhanc,2019-09-26T16:54:55Z,1,1,00:00:33
2,ganesh-28,2019-09-26T16:52:59Z,closed,harshavardhanc,2019-09-26T16:55:19Z,1,1,00:00:33
1,ganesh-28,2019-09-26T16:46:52Z,closed,harshavardhanc,2019-09-26T16:47:25Z,1,1,00:00:33
Который является, добавляют различие ко всей строке.
Но мое требование для получения различия времени только для той строки. Вывод должен быть похожим на это.
4,ganesh-28,2019-09-26T16:56:40Z,closed,harshavardhanc,2019-09-26T16:57:02Z,1,1,00:00:22
3,ganesh-28,2019-09-26T16:54:25Z,closed,harshavardhanc,2019-09-26T16:54:55Z,1,1,00:00:30
2,ganesh-28,2019-09-26T16:52:59Z,closed,harshavardhanc,2019-09-26T16:55:19Z,1,1,00:02:20
1,ganesh-28,2019-09-26T16:46:52Z,closed,harshavardhanc,2019-09-26T16:47:25Z,1,1,00:00:33
Кто-то помогает мне достигнуть этого.
Последние awk управляют в Вашем цикле
awk -v v1="$diff" -F"," 'BEGIN { OFS = "," } {$9=v1; print}' a.csv >> b.csv
обрабатывает целый файл a.csv
при каждом повторении цикла, и добавляет целый результат к b.csv
каждый раз.
По-видимому, то, что Вы предназначили, должно было применить команду только к текущему содержанию $line
переменная - в bash
можно сделать это со здесь строка
awk -v v1="$diff" -F"," 'BEGIN { OFS = "," } {$9=v1; print}' <<<"$line" >> b.csv
Однако обработка файлов CSV линию за линией в цикле оболочки обычно не рекомендуется - Вы могли бы хотеть рассмотреть использование утилиты, которая обеспечивает дату и время, обрабатывающую исходно (Perl, Python, GNU Awk) или Miller напр.
mlr --csvlite --implicit-csv-header --headerless-csv-output put -S '
$9 = strftime(strptime($6,"%Y-%m-%dT%H:%M:%SZ") - strptime($3,"%Y-%m-%dT%H:%M:%SZ"),"%T")
' a.csv > b.csv
(удалите --implicit-csv-header --headerless-csv-output
если Ваш файл CSV действительно на самом деле имеет заголовки).
См. также