【问题标题】:how to convert date column of a file into user input format如何将文件的日期列转换为用户输入格式
【发布时间】:2016-04-26 10:17:03
【问题描述】:

我有一个文件,它有 7 列并且缺少原始数据,它的日期列格式和日期列的数量是动态的,可能是一列或两列或三列,日期格式是 DD-MON-YYYY HH24:MIDD-MM-YYYY HH:MIDD/MON/YYYY HH:MI 等..

文件.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

期望的输出:

文件.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 实现它?

【问题讨论】:

  • 你有没有尝试过?你是什​​么意思日期列是动态的。为什么第 6 列没有转换。是什么决定了它是否是一个日期?
  • 表示上例中的第 5 和第 7 列是日期列,可能是第 6 列或第 5 列,日期格式会有所不同

标签: linux date awk


【解决方案1】:

这个 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 格式。

【讨论】:

  • 它可以工作,但日期格式是用户输入的,我如何将其用于其他日期格式 dt=MON-DD-YYYY HH24:MI
  • 在我的问题中,我说日期格式是用户输入,我将更改为不同的日期格式
  • @joseph 好的,我明白了,那么也许我们可以求助于外部日期命令。将用户输入格式传递给日期。如果我有时间,我会稍后检查。
【解决方案2】:

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

【讨论】:

  • 很好,谢谢,但第 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 10:10 PM PRIYS3|ANK37748|DEL37728|KEJRSRC|01-01-1970 05:29 AM| 201407061815|29-10-1952 晚上 9:10
  • 您提供的示例输入对我来说效果很好。
  • 所以问题是什么 $5 列只有问题我的操作系统是“redhat linux 6”strftime 需要任何初始化.. 我面临另一个问题我将日期列和日期格式分配给变量但日期格式不工作 dt="%d-%m-%Y %I:%M %p" awk -F"|" -v OFS="|" '{ gsub(/../, "&", '$num');sub(/ /,"", '$num'); gsub(/../, "&", '$num1');sub(/ /,"", '$num1');打印 $1,$2,$3,$4,strftime('$dt', mktime('$num'" 00")),$6,strftime('$dt', mktime('$num1'" 00")) }'文件.txt
  • 我编辑了答案以接受 numnum1 作为输入变量。我已经在 RHEL6 上测试过了。
  • num 和 num1 对我来说很好,但 '$dt' 变量我不能
猜你喜欢
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 2016-12-02
  • 2014-02-25
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多