awk удалить символы, отличные от ascii

Я пытаюсь удалить символы, отличные от ascii, из большого текстового файла. Я погуглил и нашел следующую команду tr, которая отлично работает. Однако я хочу использовать awk, потому что эта команда войдет в мой существующий сценарий awk. Буду признателен за любую помощь!

tr -cd '\11\12\15\40-\176' < InputFile > OutputFile

person rogerwhite    schedule 21.05.2020    source источник
comment
Это не просто удаляет символы, отличные от ASCII, но также удаляет некоторые символы ASCII. В частности, он удалит символы ASCII \ 00- \ 10, \ 13, \ 14, \ 16- \ 39 и \ 177. Я чувствую, что ваша цель на самом деле состоит не в том, чтобы удалить символы, отличные от ASCII, а в чем-то еще, и для него может быть уже существующий класс символов POSIX (или их комбинация). Может быть, вы хотите удалить все символы в классе символов [:cntrl:]? если вы расскажете нам, что вы действительно пытаетесь сделать, и предоставите минимальный воспроизводимый пример с кратким, тестируемым образцом ввода и ожидаемый результат, тогда мы сможем помочь.   -  person Ed Morton    schedule 21.05.2020
comment
Спасибо, Эд. Задача состоит в том, чтобы очистить некоторые текстовые файлы и загрузить их в облако AWS. Затем используйте запрос выбора S3 для поиска данных. Проблема с AWS Select заключается в том, что как только он видит в файле символ, отличный от UTF8, он выдаёт ошибку ... в моих текстовых файлах много мусора. В любом случае, если есть символ, отличный от UTF8, то, скорее всего, он мне не нужен. следовательно, я могу избавиться от него перед загрузкой в ​​AWS   -  person rogerwhite    schedule 22.05.2020
comment
Кодировка UTF8 использует 8 бит и поэтому может хранить 256 символов. Символы ASCII используют 7 бит (следовательно, их 128), поэтому они могут быть сохранены как UTF8 и оставляют место для других 128 символов (например, для кодирования символов с диакритическими знаками). Ваш сценарий удаляет все символы ASCII, кроме подмножества. Вы не можете надежно протестировать данный файл, чтобы увидеть, закодирован ли он в UTF8 или UTF16 или что-то еще (file догадывается), и вы не можете определить, является ли данная последовательность байтов в файле кодировкой x в кодировке UTF8 или какой-то другой -кодированный y (где x и y - некоторые символы). Итак, я не понимаю, как вы могли делать то, что говорите, что хотите.   -  person Ed Morton    schedule 22.05.2020
comment
Взгляните на unix.stackexchange.com/q/11602/133219 и stackoverflow.com/q/19212306/1745001 для получения дополнительной информации о кодировках Unicode и о том, как ASCII вписывается в них.   -  person Ed Morton    schedule 22.05.2020


Ответы (2)


Попробуйте gsub с такими же восьмеричными escape-символами в выражении в квадратных скобках:

gsub(/[^\11\12\15\40-\176]/,"")
person Community    schedule 21.05.2020
comment
Спасибо пользователю. но по какой-то причине этот код все еще не надежен. когда я его тестирую, он оставляет какой-то специальный символ. эта команда является частью моего более крупного сценария awk. следовательно, даже один символ, отличный от ascii, убивает остальную часть скрипта .. упомянутый tr -cd по-прежнему работает хорошо. Есть ли способ изменить код gsub, возможно, немного расширить его и сделать всеобъемлющим? - person rogerwhite; 22.05.2020

Согласно руководству по gawk для соответствия ASCII или не- Для символов ASCII можно использовать диапазон:

вы можете смоделировать такую ​​конструкцию, используя [\x00-\x7F]. Это соответствует всем числовым значениям от нуля до 127, что является определенным диапазоном набора символов ASCII. Используйте список дополненных символов ([^\x00-\x7F]) для соответствия любым однобайтовым символам, не входящим в диапазон ASCII.

person Ed Morton    schedule 21.05.2020