如何将文件的日期列转换为用户输入格式

时间:2016-04-26 10:17:04

标签: linux date awk

我有一个文件,它有7列,缺少raws,其日期列格式和日期列数是动态的,可能是一列或两列或三列,日期格式为DD-MON-YYYY HH24:MIDD-MM-YYYY HH:MIDD/MON/YYYY HH:MI等。

file.txt的

OIEX19|BANG37748|DEL37728|WUBXDE|200010291010|201209111625|195210290000
SEETA7|CHA38228|DEL37728|DGSDFE|201211190705|201308071912|195210291010
PRIYS3|ANK37748|DEL37728|KEJRSRC|196004080910|201407061815|195210292110

在上面的第5列和第7列中是日期列

用户输入日期格式为DD-MON-YYYY HH:MI

期望的输出:

file.txt的

OIEX19|BANG37748|DEL37728|WUBXDE|29-10-2000 10:10 AM|201209111625|29-10-1952 12:00 AM
SEETA7|CHA38228|DEL37728|DGSDFE|19-11-2012 07:05 PM|201308071912|29-10-1952 10:10 PM
PRIYS3|ANK37748|DEL37728|KEJRSRC|08-04-1960 09:10 AM|201407061815|29-10-1952 9:10 PM

如何使用awk实现目标?

2 个答案:

答案 0 :(得分:0)

使用gawk

awk -F"|" -v OFS="|" '{
    gsub(/../, "& ", $5);sub(/ /,"", $5);
    gsub(/../, "& ", $7);sub(/ /,"", $7);
    print $1,$2,$3,$4,strftime("%d-%m-%Y %I:%M %p", mktime($5" 00")),$6,strftime("%d-%m-%Y %I:%M %p", mktime($7" 00"))
}' file

样本输入输出为:

OIEX19|BANG37748|DEL37728|WUBXDE|29-10-2000 10:10 AM|201209111625|29-10-1952 12:00 AM
SEETA7|CHA38228|DEL37728|DGSDFE|19-11-2012 07:05 AM|201308071912|29-10-1952 10:10 AM
PRIYS3|ANK37748|DEL37728|KEJRSRC|08-04-1960 09:10 AM|201407061815|29-10-1952 09:10 PM

字段位置作为awk的变量:

awk -F"|" -v OFS="|" -v dtf="%d-%m-%Y %I:%M %p" -v num=5 -v num1=7 '{
    gsub(/../, "& ", $num);sub(/ /,"", $num);
    gsub(/../, "& ", $num1);sub(/ /,"", $num1);
    print $1,$2,$3,$4,strftime(dtf, mktime($num" 00")),$6,strftime(dtf, mktime($num1" 00"))
}' file

如果所有包含12位数的字段都需要转换:

awk -F"|"  -v OFS="|" -v dtf="%d-%m-%Y %I:%M %p" '{
    for ( i=1;i<=NF;i++) {
        if( $i ~ /^[0-9]+$/ && length($i)==12 ) {
            gsub(/../, "& ", $i);
            sub(/ /,"", $i);
            $i=strftime(dtf, mktime($i" 00"))
        }
    }
};
1' file

答案 1 :(得分:0)

gawk 单行将您的日期($ 5和$ 7)转换为DD-MON-YYYY HH24:MI格式:

 awk 'BEGIN{FS=OFS="|";re="^(....)(..)(..)(..)(..)$";rep="\\3-\\2-\\1 \\4:\\5"}
     {$5=gensub(re, rep,"g",$5);$7=gensub(re,rep,"g", $7)}7' file

以您的数据作为输入,输出:

OIEX19|BANG37748|DEL37728|WUBXDE|29-10-2000 10:10|201209111625|29-10-1952 00:00
SEETA7|CHA38228|DEL37728|DGSDFE|19-11-2012 07:05|201308071912|29-10-1952 10:10
PRIYS3|ANK37748|DEL37728|KEJRSRC|08-04-1960 09:10|201407061815|29-10-1952 21:10

请注意,输入中的第二行,我不知道如何将201211190705视为07:05 PM。另外19521029101010:10 PM。在我的代码中,我只是假设他输入的是HH24格式。