awk变量中的日期操作:非军事格式

时间:2015-11-19 15:24:57

标签: linux unix awk

在上述代码中:| awk '{ print $1, $2 }' AWK $ 2 在其中“星期四11月19日17:00:00 ”。我想在非军事格式“ Thu Nov 19 05:00:00 PM PM ”中以内联awk操纵此日期字符串。请帮忙。

3 个答案:

答案 0 :(得分:3)

这一行应该为您提供预期的格式:

kent$  echo "Thu Nov 19 17:00:00 2015"|awk '{d=$0;cmd="date -d\""d"\" +\"%a %b %d %r %Y\"" ;cmd|getline $0;close(cmd)}7'
Thu Nov 19 05:00:00 PM 2015

在这里:

kent$  echo "FOO,Thu Nov 19 17:00:00 2015"|awk -F, '{d=$2;cmd="date -d\""d"\" +\"%a %b %d %r %Y\"" ;cmd|getline $2;close(cmd);print "col1:"$1 RS "col2:"$2}'        
col1:FOO
col2:Thu Nov 19 05:00:00 PM 2015

答案 1 :(得分:3)

$ echo "Thu Nov 19 17:00:00 2015" |
awk '{
    split($4,t,/:/)
    if (t[1]<12) {
        ampm="AM"
        if (t[1]==0) {
            t[1]=12
        }
    }
    else {
        ampm="PM"
        if (t[1]>12) {
            t[1]=t[1]-12
        }
    }
    $4=sprintf("%02d:%02d:%02d %s",t[1],t[2],t[3],ampm)
} 1'
Thu Nov 19 05:00:00 PM 2015

答案 2 :(得分:2)

使用GNU awk:

gawk -F, -v OFS=, '
    BEGIN {months = "..JanFebMarAprMayJunJulAugSepOctNovDec"}
    function monthName2Num(monthname) {
        return index(months, monthname)/3
    }
    function convertTime(datetime,          a,t) {
        split(datetime, a, "[ :]+")
        t = mktime(a[7]" "monthName2Num(a[2])" "a[3]" "a[4]" "a[5]" "a[6])
        return strftime("%a %b %e %r %Y", t)
    }
    { print $1, convertTime($2) }
' <<'END'
something,Thu Nov 19 17:00:00 2015 
END

输出

something,Thu Nov 19 05:00:00 PM 2015