重新格式化出生日期的函数。还使用 awk 在当天删除“前导零”

Function that reformats the date of birth. Also remove “leading zero” on the day using awk

我在 awk 中有任务,我必须创建执行以下任务的脚本:** 打印电子邮件地址包含超过 40 个字符的所有行。然后创建一个重新格式化出生日期的函数。还要去掉当天的“前导零”。

输入

firstname,lastname,city,born,phone,email
Joseph,Långström,Upplands Väsby och Sollentuna,1997-11-02,555403172,joseph.langstrom@upplands_vasby_och_sollentuna.se
Salma,Helin,Hällaryd,2002-07-03,555674792,salma.helin@hallaryd.se
Maximiliam,Ahlstrand,Stångenäs och Rixö,2001-06-03,555914429,maximiliam.ahlstrand@stangenas_och_rixo.se
Sanna,Wahlgren,Torhamn,2004-08-02,555493393,sanna.wahlgren@torhamn.se

想要的输出

Joseph 2/nov-1997
Maximiliam 3/jun-2001

这是我的进展

BEGIN {FS = ","}

NR == 1 { next }

{
    if (length() > 40){print [=12=]}
        
}

END {
    print "\n-------------------------------\n"
}

我得到的结果

Joseph,Långström,Upplands Väsby och Sollentuna,1997-11-02,555403172,joseph.langstrom@upplands_vasby_och_sollentuna.se
Maximiliam,Ahlstrand,Stångenäs och Rixö,2001-06-03,555914429,maximiliam.ahlstrand@stangenas_och_rixo.se

我的问题是

然后创建一个重新格式化出生日期的函数。还要去掉当天的“前导零”。

我被困住了,不知道如何继续,如果有人可以帮助或指导我。提前致谢

这个 awk 解决方案应该有效

awk -F, 'length {gsub(/-/," ");=strftime("%d/%b-%Y", mktime(" 0 0 0"));sub(/0/,"",)} NR > 1 { print , }' input_file

length - 跳过空行

gsub(/-/," ") - 更改 mktime 的日期格式以使用

=strftime("%d/%b-%Y", mktime(" 0 0 0")) - 更改日期格式 输出

$ awk -F, 'length {gsub(/-/," ");=strftime("%d/%b-%Y", mktime(" 0 0 0"));sub(/0/,"",)} NR > 1 { print , }' input_file

Joseph 2/Nov-1997

Salma 3/Jul-2002

Maximiliam 3/Jun-2001

Sanna 2/Aug-2004

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

$ cat tst.awk
BEGIN { FS="," }
length() > 40 {
    split(,d,/-/)
    year  = d[1]
    month = substr("janfebmaraprmayjunjulaugsepoctnovdec",(d[2]-1)*3+1,3)
    day   = d[3] + 0
    print , day "/" month "-" year
}

$ awk -f tst.awk file
Joseph 2/nov-1997
Maximiliam 3/jun-2001

d[] 是由 split 创建的用于保存日期组件的数组(请参阅 awk 手册中的 split()),(d[2]-1)*3+1 正在为字符串创建索引在它前面的月份名称缩写所以 substr() (再次,请参阅手册)可以 return 该月份名称缩写,并且 d[3]+00 添加到日期编号以去除在生成的字符串-> 数字转换期间前导零。