Разделитель записей AWK, установленный на пустую строку, не работает

Я пытаюсь написать простой скрипт AWK, который использует пустые строки в качестве разделителя записей. Я воспроизвел на своем ПК пример из руководства GNU AWK Multi-Line Записи. Я копирую код ниже:

# addrs.awk --- simple mailing list program

# Records are separated by blank lines.
# Each line is one field.
BEGIN { RS = "" ; FS = "\n" }

{
      print "Name is:", $1
      print "Address is:", $2
      print "City and State are:", $3
      print ""
}

Вход:

Jane Doe
123 Main Street
Anywhere, SE 12345-6789

John Smith
456 Tree-lined Avenue
Smallville, MW 98765-4321

Файлы создаются в системе UNIX.

Требуемый вывод:

Name is: Jane Doe
Address is: 123 Main Street
City and State are: Anywhere, SE 12345-6789

Name is: John Smith
Address is: 456 Tree-lined Avenue
City and State are: Smallville, MW 98765-4321

Вместо этого я получаю результат, который отличается от ожидаемого. Что я получаю:

Name is: Jane Doe
Address is: 123 Main Street
City and State are: Anywhere, SE 12345-6789

Кто-нибудь знает, почему я получаю неправильный результат? AWK находит только 1 запись вместо 2, знаете почему?


person mike    schedule 20.01.2016    source источник
comment
ваш текущий вывод выглядит правильно. Пожалуйста, обновите свой вопрос, указав 2 образца входных записей И необходимые выходные данные хотя бы из одной из этих записей. Кроме того, если Windows участвовала в создании вашего файла данных, очистите его w dos2unix datafile. Удачи.   -  person shellter    schedule 20.01.2016
comment
Пробовал, работает как надо на OS X   -  person terence hill    schedule 20.01.2016
comment
Прекрасно работает на моей старомодной коробке SUSE   -  person JNevill    schedule 20.01.2016
comment
Попробуйте распечатать $0; это скажет вам, что думает awk в записи. На какой платформе вы тестируете? Вы используете GNU awk?   -  person Jonathan Leffler    schedule 20.01.2016
comment
Я собираюсь добавить комментарий к окончанию строк DOS. Я ожидаю, что проблема здесь. Попробуйте идею dos2unix (или аналогичную).   -  person Etan Reisner    schedule 21.01.2016
comment
У меня Mint 17.2, и да, это GNU AWK. Печать $0 показывает весь ввод. Как писал в последней строчке AWK находит только 1 запись! Файл создан в UNIX, запуск dos2unix не дает результата!   -  person mike    schedule 21.01.2016
comment
Если вы посмотрите на шестнадцатеричный код, какие символы вы видите между 6789 и John?   -  person jas    schedule 21.01.2016
comment
Я вижу 0a 0a, что правильно \n\n   -  person mike    schedule 21.01.2016
comment
Запустите awk '{print NR, NF, "<" $0 ">"}' file в вашем входном файле и отредактируйте свой вопрос, чтобы показать результат.   -  person Ed Morton    schedule 21.01.2016
comment
Какова цель этого? Вы имеете в виду заменить отпечатки на свои?   -  person mike    schedule 21.01.2016
comment
Странно, я снова скопировал и вставил с веб-сайта, и это сработало O.o... Клянусь, раньше у меня был неправильный вывод.   -  person mike    schedule 21.01.2016
comment
@mike цель состояла в том, чтобы увидеть, что awk думает о содержимом вашего входного файла, строка за строкой и поле за полем, но похоже, что уже слишком поздно отлаживать это сейчас.   -  person Ed Morton    schedule 21.01.2016


Ответы (1)


Это для подтверждения того, что:

(1) данная программа работает правильно, используя awk version 20070501, gawk или mawk, при условии, что входной файл имеет пустые окончания строк новой строки ('\n') (в отличие от CR LF).

(2) если вход представляет собой текстовый файл DOS, то результат соответствует указанному в OP.

Кроме того, если входной файл является текстовым файлом DOS, альтернативой dos2unix является использование tr, как показано здесь:

$ tr -d '\r' < input.dos.txt | awk ....
person peak    schedule 20.01.2016
comment
Спасибо, теперь это работает. До сих пор не знаю, почему я снова скопировал и вставил, и это сработало... - person mike; 21.01.2016