1

我有一个文件: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
4

4 回答 4

3

编辑:根据 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
于 2020-07-03T17:58:30.520 回答
2

使用 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))
    }
    {
        $1 = transformTime($1)
        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
于 2020-07-03T18:53:37.067 回答
1
{
    for (i=0; i<4; i++) {
        t[i] = substr($1, 2*i+1, 2);
    }
    d = t[0]"-"t[1]"-"t[2]" "t[3]":00";
    cmd = "date --date='"d"' +%HH%d%b%Y";
    cmd | getline $1;
    close(cmd);
    print
}

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

于 2020-07-03T19:44:55.443 回答
1

在每个 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($1); i+=2) {
        t[(i-1)/2+1] = substr($1,i,2)
    }
    $1 = 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
于 2020-07-04T14:11:17.617 回答