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