awk 中按字母顺序排列的数字日期

Number date to Alphabetic in 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([=12=],7,2)"H"substr([=12=],5,2)substr([=12=],3,2)substr([=12=],1,2), , }' ifile.txt

编辑: 根据 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,2)>=00 && substr(,1,2)<=curr_year?"20":"19"
  =substr(,length()-1)"H"substr(,length()-3,2) months[substr(,3,2)] year substr(,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]
  }
}
{
  =substr(,length()-1)"H"substr(,length()-3,2) months[substr(,3,2)] "19" substr(,1,2)
  print
}
' Input_file

使用 GNU awk:

awk -v OFS="  " '
    function totime(t,     c, y, m, d, h) {
        y = substr(t, 1 ,2)
        m = substr(t, 3, 2)
        d = substr(t, 5, 2)
        h = substr(t, 7, 2)
        c = y >= 69 ? 19 : 20   # GNU date treats years 69-99 as 19xx else 20xx
        return mktime(c y " " m " " d " " h " 0 0")
    }
    function transformTime(t) {
        return strftime("%HH%d%b%Y", totime(t))
    }
    {
         = transformTime()
        print
    }
' ifile.txt
03H06Aug1983  55  72
07H06Sep1987  83  87
12H06Jan1988  82  44
03H06Aug1989  55  72
07H06Nov2000  83  87
12H06Mar2001  82  44
18H06Dec2005  84  44

或者,Perl

perl -MTime::Piece -lane '
    $F[0] = Time::Piece->strptime($F[0], "%y%m%d%H")->strftime("%HH%d%b%Y");
    print join("  ", @F);
' ifile.txt
{
    for (i=0; i<4; i++) {
        t[i] = substr(, 2*i+1, 2);
    }
    d = t[0]"-"t[1]"-"t[2]" "t[3]":00";
    cmd = "date --date='"d"' +%HH%d%b%Y";
    cmd | getline ;
    close(cmd);
    print
}

将以上内容保存为script.awk,将运行保存为awk -f script.awk ifile.txt。它使用date命令进行日期格式转换。

在每个 UNIX 机器上的任何 shell 中使用任何 awk:

$ cat tst.awk
BEGIN {
    split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",mths)
}
{
    for (i=1; i<length(); i+=2) {
        t[(i-1)/2+1] = substr(,i,2)
    }
     = t[4] "H" t[3] mths[t[2]+0] "19" t[1]
    print
}

.

$ awk -f tst.awk file
03H06Aug1983 55 72
07H06Sep1987 83 87
12H06Jan1988 82 44
03H06Aug1989 55 72
07H06Nov1900 83 87
12H06Mar1901 82 44
18H06Dec1905 84 44