我编写了matchs.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'出现的次数是file.txt(53)中的四倍(212)。知道为什么会这样吗?
答案 0 :(得分:4)
您的代码中有错别字(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) }}
经过测试,似乎还可以(即,regexp将在您的行上出现一次)。
无论如何,恐怕您不了解您的代码是如何工作的。请检查String functions GAWK页面,查看match()和substr()的实际作用以及它们返回的内容。