Awk печатает больше записей, чем в оригинальном файле - PullRequest
0 голосов
/ 30 июня 2019

Я написал match.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).Есть идеи, почему это так?

1 Ответ

4 голосов
/ 30 июня 2019

В вашем коде есть опечатка (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 () и что они возвращают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...