重新格式化出生日期的函数。还使用 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]+0
将 0
添加到日期编号以去除在生成的字符串-> 数字转换期间前导零。
我在 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]+0
将 0
添加到日期编号以去除在生成的字符串-> 数字转换期间前导零。