首页 > 解决方案 > awk 打印的记录多于原始文件中的记录

问题描述

我已经编写了matches.awk 以从文本文件的每一行打印与我的正则表达式匹配的文本。

`{
    line = $0
    while (match(line, /([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?))))[[:space:]]?[0-9][A-Za-z]{2})/)>0) {

       print substr(line, RSTART, RLENGTH)
       line = substr(line, RSART + RLENGTH) }}`

然后我打电话给

awk -f matches.awk file.txt

它正在正确打印数据,但奇怪的是打印某些记录的频率远远高于它们在文本文件中出现的频率。

这条记录是 file.txt '20 Lilac Grove, Leeds LS5 3AG, Lilac Grove' 中的一行,它出现的次数 (212) 是 file.txt (53) 中的四倍。知道这是为什么吗?

标签: awk

解决方案


您的代码中有错字(RSART 而不是 RSTART)。

它应该是:

 {
    line = $0
    while (match(line, /([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?))))[[:space:]]?[0-9][A-Za-z]{2})/)>0) {

       print substr(line, RSTART, RLENGTH)
       line = substr(line, RSTART + RLENGTH) }}

刚刚经过测试,似乎没问题(即:正则表达式将在您的线路上运行一次)。

无论如何,恐怕你不明白你的代码是如何工作的。请检查字符串函数 GAWK页面,看看 match() 和 substr() 实际做了什么以及它们返回什么。


推荐阅读