Добавьте или добавьте новый столбец к файлу CSV с помощью сценария оболочки

У меня есть файл 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

Кто-то помогает мне достигнуть этого.

0
задан 20 November 2019 в 08:51

1 ответ

Последние 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 действительно на самом деле имеет заголовки).

См. также

1
ответ дан 21 December 2019 в 23:53

Другие вопросы по тегам:

Похожие вопросы: