Необходимо разделить дату и время на два отдельных поля, используя awk - PullRequest
3 голосов
/ 03 октября 2019

У меня есть следующая команда awk и выходные данные для преобразования файла DAT в CSV с определенной FS, но я хотел бы, чтобы поля, содержащие значение даты и времени, были разделены на два отдельных поля плюс добавление: 00 секунд в формате времени.

команда awk:

awk 'BEGIN{FS="\024"; OFS = ","; ORS = "\n"} {gsub(/\376/, "\"", $0); print $1, $2, $3, $4, $5}' input.dat > output.csv

вход

þNUMþþDATE CREATEDþþDATE SENTþþDATE MODIFIEDþþDATE RECEIVEDþ þNUM00000001þþþþ9/11/2017 12:00 AMþþ6/16/2018 12:00 AMþþþ þNUM00000002þþþþ5/2/2016 12:00 AMþþ6/16/2018 12:00 AMþþþ

выход:

"NUM","DATE CREATED","DATE SENT","DATE MODIFIED","DATE RECEIVED" "NUM00000001","","9/11/2017 12:00 AM","6/16/2018 12:00 AM","" "NUM00000002","","5/2/2016 12:00 AM","6/16/2018 12:00 AM",""

желаемый результат:

"NUM","DATE CREATED","CREATED TIME","DATE SENT","SENT TIME","DATE MODIFIED","MOD TIME","DATE RECEIVED","RECEIVED TIME" "NUM00000001","","","9/11/2017","12:00:00 AM","6/16/2018","12:00:00 AM","","" "NUM00000002","","","5/2/2016","12:00:00 AM","6/16/2018","12:00:00 AM","",""

Можно ли добавить код для каждого поля для выполнения разделения? Обратите внимание, что некоторые строки / строки могут иметь значение NULL для даты / времени.

1 Ответ

0 голосов
/ 04 октября 2019

На основе данных примера, время и дату нужно разделить на первый пробел на дату и время. Вы можете использовать функции awk. Например:

awk '
  # Get Date
function get_d (v) {
  sep = index(v, " ")
  return substr(v, 1, sep-1) "\"" ;
}
   # Get Time
function get_t (v) {
  sep = index(v, " ")
  if ( !sep ) return ""
  # insert :00 to time.
  tt= substr(v, sep+1, 5) ":00" substr(v, sep+6)
  # Remove leading zero from hour.
  sub("^0", "", tt)
  return "\"" substr(v, sep+1, 5) ":00" substr(v, sep+6)
#  return "\"" substr(v, sep+1, 99) ;

}

BEGIN {FS="\024"; OFS = ","; ORS = "\n"}
{gsub(/\376/, "\"", $0);
  print $1, get_d($9), get_t($9), get_d($10), get_t($10), get_d($11), get_t($11), get_d($12), get_t($12)}
' input.dat > output.csv
...