首页 > 解决方案 > 在awk中将数字日期转换为字母

问题描述

我有一个文件:ifile.txt

83080603   55  72
87090607   83  87
88010612   82  44
89080603   55  72
00110607   83  87
01030612   82  44
05120618   84  44

第一列显示日期和时间,格式为 YYMMDDHH。

我想将第一列打印为 hrHDDMMMYYYY ofile.txt

03H06Aug1983   55  72
07H06Sep1987   83  87
12H06Jan1988   82  44

and so on

我无法将数字月年转换为文本月。我的脚本是

awk '{printf "%s%5s%5s\n",
substr($0,7,2)"H"substr($0,5,2)substr($0,3,2)substr($0,1,2), $2, $3}' ifile.txt

标签: dateawk2-digit-year

解决方案


编辑:根据 OP 的评论添加解决方案,在此处根据条件添加年份。

awk -v curr_year=$(date +%y) '
BEGIN{
  num=split("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",arr,",")
  for(j=1;j<=num;j++){
    key=sprintf("%02d",j)
    months[key]=arr[j]
  }
}
{
  year=substr($1,1,2)>=00 && substr($1,1,2)<=curr_year?"20":"19"
  $1=substr($1,length($1)-1)"H"substr($1,length($1)-3,2) months[substr($1,3,2)] year substr($1,1,2)
  print
  year=""
}
' Input_file


您能否尝试以下操作,在移动设备上编写并在网站上成功测试https://ideone.com/4zYMu7 这也假设由于您的 Input_file 前 2 个字母表示年份,并且您只想打印 19 以防万一还有其他逻辑得到确切的年份然后请务必提及

awk '
BEGIN{ 
  num=split("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",arr,",")
  for(j=1;j<=num;j++){
    key=sprintf("%02d",j)
    months[key]=arr[j]
  }
}
{
  $1=substr($1,length($1)-1)"H"substr($1,length($1)-3,2) months[substr($1,3,2)] "19" substr($1,1,2)
  print
}
' Input_file

推荐阅读