Источник проблемы в разделителе $1," ",$2
.
Из документации:
Многомерные массивы поддерживаются в awk посредством конкатенации индексы в одну строку. awk преобразует индексы в строки (см. Преобразование) и объединяет их вместе с разделителем между их. Это создает одну строку, описывающую значения отдельные индексы. Объединенная строка используется как единый индекс в обычный одномерный массив. В качестве разделителя используется значение встроенная переменнаяSUBSEP
SUBSEP
Разделитель нижнего индекса. Он имеет значение по умолчанию "\034" и используется для разделения частей индексов многомерный массив. Таким образом, выражение ‘foo["A", "B"]’ на самом деле обращается к foo["A\034B"]
Стандартный awk моделирует многомерные массивы, разделяя значения нижнего индекса запятыми. Значения объединяются в одну строку, разделенную значением SUBSEP.
Тот факт, что такой индекс был создан таким образом, не сохраняется; таким образом, изменение SUBSEPможет иметь неожиданные последствия.
Похоже, sed
не очень хорошо работает с двоичными подстановками. Я только что проверил, что вы делаете с tr
, хотя, похоже, он работает. На самом деле это довольно просто сделать с помощью одной команды, а также:
cat /path/to/file1 | tr "$(printf "\302\240")" " " > /path/to/file1_new
tr
- это инструмент для «перевода» набора символов в его первом аргументе в набор во втором аргументе (который расширен, чтобы соответствовать длине первый комплект при необходимости). Поэтому мы просто переводим каждый символ в пробел, как вы пытались сделать с sed
.
Обратите внимание, что вы можете обращаться к восьмеричным/шестнадцатеричным числам непосредственно в sed
как:
sed -e 's/\o302/ /g' #in octal
sed -e 's/\xC2/ /g' #in hex