如何用awk转换日期

时间:2015-09-24 23:50:01

标签: macos bash date awk

我的档案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

2 个答案:

答案 0 :(得分:2)

这个 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)返回从n开始的s - 字符子字符串m(从1开始)。 mktime("YYYY MM DD HH MM SS")将日期字符串转换为时间戳(自纪元以来的秒数)。 FSOFS分别是输入和输出字段分隔符。 BEGIN模式的花括号之间的命令仅在开始时执行,而其他模式在文件的每一行上执行。

答案 1 :(得分:0)

您可以使用substr:

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

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