Проверка двоичных символов GAWK - PullRequest
0 голосов
/ 30 апреля 2020

Win 7-64 Cygwin GNU Awk 5.1.0

Я пытаюсь разработать программу для обработки файлов в формате DOS и Unix. Похоже, единственное различие между ними на уровне приложения состоит в том, что последний символ строки в файле DOS - «\ r». Я не могу понять, как сделать сравнение.

Мой ввод выглядит как "w, x, y, z", где z может быть "" в Unix для "\ r" в DOS. Не работает следующее:

if (z || z == "\r") # проверка для Unix ($ 4) и DOS ($ 4 == "\ r").

Ответы [ 2 ]

1 голос
/ 01 мая 2020

gawk может даже не видеть \r, так как они могут быть удалены базовыми примитивами. Вам нужно установить BINMODE, чтобы ваш скрипт их видел. См. https://www.gnu.org/software/gawk/manual/gawk.html#Built_002din -Переменные и https://www.gnu.org/software/gawk/manual/gawk.html#PC -Использование , где говорится о:

Под MS- Windows, gawk (и многие другие текстовые программы) тихо переводит конец строки '\ r \ n' в '\ n' на входе и '\ n' в '\ r \ n' на выходе.

Таким образом, вы можете do:

awk -v BINMODE=3 '
{ print "is " ( /\r$/ ? "" : "not " ) "dos" }
'

, но даже при этом вы не можете построчно определить, имеет ли файл конец строки DOS или нет, поскольку инструменты Windows могут генерировать текст в кавычках с переводами строки в в середине, например, Excel будет выводить

"foo","some\nother\nstuff","bar"\r\n

, где приведенное выше представляет собой одну строку в электронной таблице, если средняя ячейка электронной таблицы содержит пару строк, и это будет выглядеть так и будет читаться как 3 отдельных строк от gawk на платформе UNIX, если вы специально не установили RS='\r\n':

"foo","some
other
stuff","bar"\r

Таким образом, чтобы определить, имеет ли ваш файл конец строки DOS или нет, вам нужно искать весь входной файл, пока вы не найдете \r\n и даже тогда вы на самом деле не ЗНАЕТЕ, если это то, что это значит - может быть, данные просто имеют \r на конец одной строки.

Из ваших комментариев ниже я думаю, что вы пытаетесь сделать что-то, что просто невозможно.

Вот файл, созданный на UNIX и использующий UNIX окончания строк где конечное поле равно bar\r:

foo,bar\r\n

Вот файл, созданный в Windows и использующий окончания строки DOS, где конечное поле равно bar:

foo,bar\r\n

As вы можете видеть, что нет никакого способа программно определить, исходя только из файла foo,bar\r\n, что означает 2 вышеуказанных случая.

0 голосов
/ 30 апреля 2020
$ cat -t carriage
a1^M
a2^M
$ cat -t nocarriage
a1
a2
$ gawk '/\r/' carriage
a1
a2
$ gawk '/\r/' nocarriage

Как видите, с gawk просто проверить, есть ли в каждой строке возврат каретки. Запись восьмеричного \015 является возможной альтернативой \r.

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