Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何将文件的日期列转换为用户输入格式_Linux_Date_Awk - Fatal编程技术网

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

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

我有一个文件,它有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
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。如果有时间,我会稍后检查。