Преобразование столбца с использованием даты и добавление в файл csv

У меня есть CSV, где в первом столбце есть строка, которая представляет дату и время. Я хотел бы добавить дополнительную колонку с тем, что datetime преобразуется в эпоху.
Я попробовал следующее:

awk -F "," 'BEGIN{ OFS="," } {$14=$(date -jf "%m/%d/%Y %H:%M:%S %p" $1 "+%s"); print}' mycsv.csv > test 

Я получил:

 awk: illegal field $(0%m/%d/%Y %H:%M:%S %p"1/30/2017 11:14:55 AM"+%s), name "(null)" input record number 1, file mycsv.csv source line number 1 

Я знаю, что преобразование даты для поля работает, поэтому я делаю что-то неправильно с синтаксисом.
Как я могу делать то, что хочу?

  • Почему мой rsync медленный?
  • Как исправить ошибку ссылки в CMake для класса QX11Info на Mac OS X
  • Относительно приравнивания атрибутов файла в команде «ls»
  • find command, есть ли способ получить отчет о проделанной работе?
  • Содержимое конвейера с несколькими пробелами
  • Просмотреть расширенные атрибуты с помощью coreutils ls на Mac
  • где находится пользовательский контент на диске Mac OS X?
  • Поиск / установка USB-устройства в Mac OS X 10.8
  • 2 Solutions collect form web for “Преобразование столбца с использованием даты и добавление в файл csv”

    У меня есть date GNU, поэтому параметры командной строки для меня разные. Но ваша проблема кажется синтаксисом awk: вы не можете использовать конструкцию подпроцесса оболочки $(...) внутри awk-скриптов. Вам понадобится функция system() , которая получает строку. Поэтому вам нужно построить допустимую команду оболочки в строку awk, которую вы можете передать системе внутри скрипта awk.

    Что-то вроде этого:

     awk -F "," 'BEGIN{ OFS="," } {$14=system("date -jf \"%m/%d/%Y %H:%M:%S %p\" \""$1"\" \"+%s\""); print}' mycsv.csv > test 

    или для лучшей удобочитаемости

     awk -F "," ' BEGIN{ OFS="," } { $14 = system("date -jf \"%m/%d/%Y %H:%M:%S %p\" \"" $1 "\" \"+%s\""); print }' \ mycsv.csv > test 

    Если у вас есть GNU awk (который, как мне кажется, должен быть доступен на OSX с помощью brew ), вы можете использовать внутренние mktime и strftime вместо того, чтобы полагаться на системную date .

    К сожалению, ваш формат ввода не находится в формате дат , ожидаемого mktime , поэтому требуется некоторое разделение и переформатирование временной строки. Например, данный

     $ cat file.csv 09/23/2016 11:12:19 AM,field2,field3 

    тогда

     gawk -F, ' { split($1,a,/[/: ]/); ts = sprintf("%4d %02d %02d %2d %2d %2d", a[3], a[2], a[1], a[7] ~ /^[Pp]/ ? a[4]+12 : a[4], a[5], a[6]); $0 = strftime("%s", mktime(ts)) FS $0 } 1' file.csv 1510243939,09/23/2016 11:12:19 AM,field2,field3 
    Linux и Unix - лучшая ОС в мире.