Linux 如何将文件的日期列转换为用户输入格式
我有一个文件,它有7列,没有RAW,它的日期列格式和日期列的数量是动态的,可能有一列、两列或三列,日期格式是Linux 如何将文件的日期列转换为用户输入格式,linux,date,awk,Linux,Date,Awk,我有一个文件,它有7列,没有RAW,它的日期列格式和日期列的数量是动态的,可能有一列、两列或三列,日期格式是DD-MON-yyyyy HH24:MI或DD-MM-yyyyy HH:MI等 file.txt OIEX19|BANG37748|DEL37728|WUBXDE|200010291010|201209111625|195210290000 SEETA7|CHA38228|DEL37728|DGSDFE|201211190705|201308071912|195210291010 PRIY
DD-MON-yyyyy HH24:MI
或DD-MM-yyyyy 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
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
在上面的第5列和第7列是日期列
用户输入日期格式为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
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
?和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
awk-F“|”-vofs=“|”-vdtf=“%d-%m-%Y%I:%m%p”{
对于(i=1;i和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
awk-F“|”-vofs=“|”-vdtf=“%d-%m-%Y%I:%m%p”{
对于(i=1;i此gawk一行代码将您的日期($5和$7)转换为DD-MON-yyyyyyyh24: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格式。这个gawk一行代码将转换您的日期($5和$7)转换为DD-MON-yyyyyy 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格式。您尝试过什么吗?日期列是动态的是什么意思。为什么第六列没有转换。什么决定它是否是日期?在上面的示例中,表示第5列和第7列是日期列,可能是仅第6列,也可能是仅第5列,并且日期格式会有所不同。您尝试过任何操作吗?表示日期列是动态的。为什么不转换第6列。如何决定它是否是日期?表示在上面的示例中,表示第5列和第7列是日期列可能是第6列,也可能是第5列,日期格式会有所不同谢谢,但第5列的输出是错误的所有$5列都有相同的答案OIEX19 | BANG37748 | DEL37728 | WUBXDE | 01-01-1970 05:29 AM | 201209111625 | 29-10-1952 12:00 AM见TA7 | CHA38228 DEL37728 | DGSDFE | 01-01-05 1970:29 AM 124308071912 | 29-10-1952 PRIYS3 | ANK37748 | DEL37728 | KEJRSRC | 01-01-1970 05:29 AM | 201407061815 | 29-10-1952 9:10 PMit对于您提供的示例输入来说很好。那么问题是什么呢$5列只有一个问题我的操作系统是“redhat linux 6”strftime需要任何初始化..我又面临一个问题,我将日期列和日期格式分配到变量中,但日期格式不起作用dt=“%d-%m-%Y%i:%m%p”awk-F“|”-v of s=“|”{gsub(/../,”,“$num”);sub(/,“,$num”);gsub(/../,“&”,“$num1”);sub(//,“,$num1”);打印$1、$2、$3、$4、strftime('$dt',mktime('$num''00”)、$6、strftime('$dt',mktime('$num1''00”))'file.txti编辑了答案,接受num
和num1
作为输入变量。我已经在RHEL6.num和num1上测试过了,对我来说效果很好,但是'$dt'变量我不能很好,谢谢,但是第5列输出错误所有$5列的答案都是相同的OIEX19 | BANG37748 | DEL37728 | WUBXDE | 01-01-1970 05:29 AM | 201209111625 | 29-10-1952 12:00 AM SEETA7 | CHA38228 | DEL37728 | DGSDFE | 01-01-1970 05:29 AM | 201308071912 | 29-10-1952 PRIYS3 | ANK37748 124728 124728 | KEJRSRC | 01-01-01-1970 05:29 AM 12470815ザ29-10-10-works您为我的问题提供了什么样的样本“redhat linux 6”strftime需要任何初始化..我又面临一个问题,我将日期列和日期格式分配到变量中,但日期格式不起作用dt=“%d-%m-%Y%i:%m%p”awk-F“|”-v of s=“”{gsub(//,“&“,“$num”);sub(/,“,$num”);gsub(//,“&”,“$num”);sub(/,“,”,“,$num1”);sub(/,”“,$num1”);打印$1,$2,$3,$4,strftime($dt',mktime($num',00”),$6,strftime($dt',mktime($num1',00”))'file.txti编辑了答案,接受num
和num1
作为输入变量。我在RHEL6.num和num1上测试了这一点,对我来说很好,但是“$dt”变量我不能工作,但是日期格式是用户输入的。我怎么能将其用于其他日期格式dt=MON-DD-yyyyy HH24:mi在我的问题中,我说日期格式是用户输入的我会换到不同的日期formats@joseph好的,我明白了,那么也许我们可以使用外部日期命令。将用户输入格式传递到date。如果我有时间,我会稍后检查它。它可以工作,但日期格式是用户输入。我如何将它用于其他日期格式dt=MON-DD-YYYY HH24:mi在我的问题中,我说日期格式是用户输入将更改为不同的日期formats@joseph好的,我明白了,那么也许我们可以使用外部日期命令。将用户输入格式传递到date。如果有时间,我会稍后检查。