匹配成功后 awk 打印“匹配”

Posted

技术标签:

【中文标题】匹配成功后 awk 打印“匹配”【英文标题】:awk print "matched" after successful match 【发布时间】:2020-06-05 04:37:02 【问题描述】:

尝试使用 awk 搜索文件中的特定行,如果匹配,则在打印每一行后写入“匹配”。

例如,如果我有一个包含姓名和电子邮件列表的文件,但我只想匹配以“@yahoo.com”结尾的电子邮件,我希望它打印出最后带有“matched”的那一行,并且如果该行不包含@yahoo.com,我只想让它打印出该行并继续。

awk -F, 'if($3~/yahoo.com/) print $1,$2,$3 " matched"else print $1,$2,$3 ' emails.txt

这会返回:

Joe Smith joe.smith@yahoo.com matched
John Doe john.doe@gmail.com 
Sally Sue sally.sue@yahoo.com`

所以它只匹配第一个@yahoo.com,然后打印其他行,不管他们的电子邮件地址是什么。我错过了什么?

【问题讨论】:

在请求帮助编写脚本来解析文件内容时,最重要的是向我们展示文件的内容。到目前为止,您已经向我们展示了您运行的脚本及其产生的输出 - 添加您运行它的输入文件,以便我们可以帮助您找出您的脚本出错的地方。还要添加预期的输出,因为是否要打印不匹配的行并不完全清楚。文本听起来像您没有,但是您的脚本确实如此,如果输出中只有匹配的行,为什么还要添加“匹配”。因此,请向我们展示示例输入和预期输出。 您测试第三个字段(逗号分隔符)。我假设“Sally Sue”记录有任何与逗号相关的问题。最好的是,您在此处提供文件emails.txt 以供进一步分析。 【参考方案1】:

请您尝试关注一下。

awk '/@yahoo\.com/print $0,"matched"' Input_file

说明:您显示的示例 Input_file 没有逗号,因此从其中删除了该字段分隔符部分。

另外一个人的名字可以有两个以上的字段,所以我不匹配条件中的第三个字段,而是在这里检查整行的条件。

【讨论】:

【参考方案2】:

这可能就是你想要的:

awk -F, 'print $0 ($NF ~ /@yahoo\.com$/ ? " matched" : "")' emails.txt

但没有看到您的输入文件,这只是未经测试的猜测。

【讨论】:

【参考方案3】:

我使用以下输入测试了示例:给定的文件分隔符是,在您的示例中,拆分后您可以访问 $3 记录(电子邮件)并匹配您的条件。

输入:

Joe,Smith,joe.smith@yahoo.com
John,Doe,john.doe@gmail.com
Sally,Sue,sally.sue@yahoo.com```

脚本

awk -F, 'if($3~/yahoo.com/) print $1,$2,$3 " matched"else print $1,$2,$3 ' emails.txt

输出:

Joe Smith joe.smith@yahoo.com matched
John Doe john.doe@gmail.com 
Sally Sue sally.sue@yahoo.com matched

【讨论】:

【参考方案4】:

如果该行以 @yahoo.com 结尾,则将整行重新分配为自身,后跟字符串 matched

awk '/@yahoo.com$/$0=$0 " matched"1' input

Joe Smith joe.smith@yahoo.com matched
John Doe john.doe@gmail.com
Sally Sue sally.sue@yahoo.com matched

【讨论】:

以上是关于匹配成功后 awk 打印“匹配”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 awk 命令在匹配正则表达式之前和之后打印 5 行

awk匹配两个文件并打印所需的输出

Bash awk 打印匹配的分隔符

如何使用 awk 打印匹配的正则表达式模式?

使用 sed 或 awk 按照匹配模式打印一行

在 awk 中打印匹配的字段分隔符