【问题标题】:Need to split date time into two separate field using awk需要使用 awk 将日期时间拆分为两个单独的字段
【发布时间】:2019-10-03 20:59:46
【问题描述】:

我有以下 awk 命令和输出来将 DAT 文件转换为具有特定 FS 的 CSV,但我希望将包含日期时间值的字段拆分为两个单独的字段,并以时间格式添加 :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。

【问题讨论】:

  • 感谢@John1024 - 用输入更新了上面的初始问题
  • þ 是 0x24 吗?您可以在特定字段上使用gsub,提取字段并输出它们。 awk 中甚至还有 split,您可以在其中将 $5 字段拆分为空格
  • @KamilCuk - 不,没有显示逗号分隔字符,它是 DC4,þ 是 376
  • 如果输入只是稳定的,你可以用sed预解析它。 sed -E 's/([0-9\/]{9}) ([0-9:]{4}) ([AP]M)/\1\024\2:00 \3/g'
  • pluse-uno 用于添加数据、当前输出、注释后所需的输出!祝你好运。

标签: awk split


【解决方案1】:

根据样本数据,datetime需要被第一个空格分割成日期和时间。您可以使用 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

【讨论】:

  • 谢谢@dash-o,这似乎可行,尽管我试图弄清楚如何在时间中添加秒数
  • 还有一个字段为 NULL,似乎添加了意外的引号,逗号
  • 如果输入中没有秒数,您可以将 :00 附加到第二个属性的时间。上面的get_t修改为添加null检查,返回值添加:00
  • 最后一个问题,如果时间格式没有 2 位数的小时,我将如何解释? 4:15 PM12:00 AM
  • 在'get_t'中,可以检查结果时间字符串是否与'0[0-9]'匹配,在这种情况下去掉前导'0'
猜你喜欢
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 2018-08-28
  • 2018-01-14
  • 1970-01-01
  • 2016-06-06
相关资源
最近更新 更多