AWK打印的记录多于原始文件中的记录

时间:2019-06-30 14:13:14

标签: awk

我编写了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)。知道为什么会这样吗?

1 个答案:

答案 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()的实际作用以及它们返回的内容。