使用 awk 打印可以在 phone 数字中找到出生日期的所有行

Print all rows where the day of birth can be found in the phone number using awk

在我的作业中,我必须创建一个 awk 脚本。该脚本应打印出生日期可以在 phone 数字中找到的所有行。

这是输入文件中的 som 行:

firstname,lastname,city,born,phone,email

Salma,Helin,Hällaryd,2002-07-03,555674792,salma.helin@hallaryd.se

Sanna,Wahlgren,Torhamn,2004-08-02,555493393,sanna.wahlgren@torhamn.se

Anni,Örn,Resarö,1994-07-08,555408537,anni.orn@resaro.se

Thilda,Brandt,Holmsjö,1994-06-25,555197921,thilda.brandt@holmsjo.se

Teo,Stenström,Borgholm,1994-04-29,555229873,teo.stenstrom@borgholm.se

Alexis,Sjödin,Ardala,1991-03-04,555190611,alexis.sjodin@ardala.se

Stina,Örn,Gladö kvarn,2010-05-25,555622513,stina.orn@glado_kvarn.se

期望的输出是:

Anni Örn, 1994-07-08, 555408537

Teo Stenström, 1994-04-29, 555229873

Stina Örn, 2010-05-25, 555622513

这是我的进展

BEGIN { FS="," }

NR == 1 { next }

{
    split(, d, "-") 
    day = d[3]     
}

我尝试拆分日期并提取出生日期。现在我必须了解如何在字段 5 中找到匹配项。例如 08 存在于 555408537 中。现在我卡住了。我不知道完成这个任务。我愿意接受任何建议。

提前致谢。

您可以使用 index 函数,如果找到则给出匹配的开始,否则给出 0,所以在您的情况下检查 >0 就足够了。让file.txt内容为

firstname,lastname,city,born,phone,email
Salma,Helin,Hällaryd,2002-07-03,555674792,salma.helin@hallaryd.se
Sanna,Wahlgren,Torhamn,2004-08-02,555493393,sanna.wahlgren@torhamn.se
Anni,Örn,Resarö,1994-07-08,555408537,anni.orn@resaro.se
Thilda,Brandt,Holmsjö,1994-06-25,555197921,thilda.brandt@holmsjo.se
Teo,Stenström,Borgholm,1994-04-29,555229873,teo.stenstrom@borgholm.se
Alexis,Sjödin,Ardala,1991-03-04,555190611,alexis.sjodin@ardala.se
Stina,Örn,Gladö kvarn,2010-05-25,555622513,stina.orn@glado_kvarn.se

然后

awk 'BEGIN{FS=","}NR==1{next}{split(, d, "-");day = d[3];if(index(,day)>0){print}}' file.txt

输出

Anni,Örn,Resarö,1994-07-08,555408537,anni.orn@resaro.se
Teo,Stenström,Borgholm,1994-04-29,555229873,teo.stenstrom@borgholm.se
Stina,Örn,Gladö kvarn,2010-05-25,555622513,stina.orn@glado_kvarn.se

请注意,由于 if 的行为方式,您不必明确地与 0 进行比较,但可以

BEGIN{FS=","}NR==1{next}{split(, d, "-");day = d[3];if(index(,day)){print}}

并得到相同的结果。我留下了修改 print-ing 以将所需的列显示为练习。作为旁注:而不是使用 next 跳过不需要的行,您可以只为感兴趣的行注册操作,在这种情况下

BEGIN{FS=","}NR>1{split(, d, "-");day = d[3];if(index(,day)){print}}

(在 gawk 4.2.1 中测试)

您可以试试这个 awk,它会检查日期是否与 phone 数字匹配。

awk -F"[,-]" ' ~  && /./' input file

~ 将检查两列中的匹配项

/./ 将删除空行

输出

Anni,Örn,Resarö,1994-07-08,555408537,anni.orn@resaro.se
Teo,Stenström,Borgholm,1994-04-29,555229873,teo.stenstrom@borgholm.se
Stina,Örn,Gladö kvarn,2010-05-25,555622513,stina.orn@glado_kvarn.se

这是另一个 awk 替代方案:

$ awk -F, 'NR > 1 &&  ~ substr(,9,10)' input
Anni,Örn,Resarö,1994-07-08,555408537,anni.orn@resaro.se
Teo,Stenström,Borgholm,1994-04-29,555229873,teo.stenstrom@borgholm.se
Stina,Örn,Gladö kvarn,2010-05-25,555622513,stina.orn@glado_kvarn.se

解释: 将字段分隔符设置为 comma-separated 值,打印除字段号 5 匹配的第一个(header)之外的所有记录字段 4 中日期的最后一部分。