【问题标题】:How to convert date with awk如何用awk转换日期
【发布时间】:2015-12-22 17:27:19
【问题描述】:

我的档案temp.txt

ID53,20150918,2015-09-19,,0,CENTER<br>
ID54,20150911,2015-09-14,,0,CENTER<br>
ID55,20150911,2015-09-14,,0,CENTER

我需要替换和转换第二个字段 (yyyymmdd) 几秒钟

我试了一下,只替换了第一行

awk -F"," '{ ("date -j -f ""%Y%m%d"" ""20150918"" ""+%s""") | getline $2; print }' OFS="," temp.txt

并试图喜欢这个

awk -F"," '{system("date -j -f ""%Y%m%d"" "$2" ""+%s""") | getline $2; print }' temp.txt

输出是:

1442619474
sh: 0: command not found
ID53,20150918,2015-09-19,,0,CENTER
1442014674
ID54,20150911,2015-09-14,,0,CENTER
1442014674
ID55,20150911,2015-09-14,,0,CENTER

使用gsub也不能

awk -F"," '{gsub($2,"system("date -j -f ""%Y%m%d"" "$2" ""+%s""")",$2); print}' OFS="," temp.txt 

awk: syntax error at source line 1
 context is
    {gsub($2,"system("date -j -f ""%Y%m%d"" "$2" >>>  ""+% <<< s""")",$2); print}
awk: illegal statement at source line 1
    extra )

我需要这样的输出。怎么做?

ID53,1442619376,2015-09-19,,0,CENTER
ID54,1442014576,2015-09-14,,0,CENTER
ID55,1442014576,2015-09-14,,0,CENTER

【问题讨论】:

  • 我想你有你的答案 [这里][1]。 [1]:stackoverflow.com/questions/20306217/…
  • @tstark81:唯一的问题是它被标记为osx,意思是Mac OS X,而Mac OS X 有BSD awk,而不是GNU awk。 GNU awk 为日期处理添加了一些强大的扩展(Timestamp to epoch in a CSV file with gawk 可能涵盖了它们。不过,除非用户安装 GNU awk,否则它在 Mac OS X 上并没有多大帮助。
  • previous answer of mine 中,我在具有默认awk 的mac 上使用了日期。它的格式不适合您的情况,但也许会对您有所帮助。

标签: macos bash date awk


【解决方案1】:

这个 GNU awk 脚本应该可以实现。如果你的 Mac 上还没有安装它,我建议安装 macport,然后安装 GNU awk。您还可以安装一个不错的版本的bashdate 和其他重要的实用程序,它们的默认设置在 OSX 上确实令人失望。

BEGIN { FS = ","; OFS = FS; }
{
    y = substr($2, 1, 4);
    m = substr($2, 5, 2);
    d = substr($2, 7, 2);
    $2 = mktime(y " " m " " d " 00 00 00");
    print;
}

将其放入文件中(例如txt2ts.awk)并使用以下命令处理您的文件:

$ awk -f txt2ts.awk data.txt
ID53,1442527200,2015-09-19,,0,CENTER<br>
ID54,1441922400,2015-09-14,,0,CENTER<br>
ID55,1441922400,2015-09-14,,0,CENTER

请注意,我们没有相同的时间戳。我让你试着理解它是从哪里来的,这是另一个问题。

说明:substr(s, m, n) 返回sn-characters 子字符串,该子字符串从位置m(以1 开始)开始。 mktime("YYYY MM DD HH MM SS") 将日期字符串转换为时间戳(自纪元以来的秒数)。 FSOFS 分别是输入和输出字段分隔符。 BEGIN 模式的大括号之间的命令仅在开头执行,而其他命令在文件的每一行执行。

【讨论】:

    【解决方案2】:

    你可以使用 substr:

    printf "%s-%s-%s", substr($6,0,4), substr($6,5,2), substr($6,7,2)
    

    假设第 6 个字段是 20150914,这将产生 2015-09-14

    【讨论】:

      猜你喜欢
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      相关资源
      最近更新 更多