我有一个文件,它有7列,缺少raws,其日期列格式和日期列数是动态的,可能是一列或两列或三列,日期格式为DD-MON-YYYY HH24:MI
或DD-MM-YYYY HH:MI
或DD/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
实现目标?
答案 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
。另外195210291010
为10:10 PM
。在我的代码中,我只是假设他输入的是HH24格式。