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 вышеуказанных случая.