Удалить символ новой строки между фиксированными length файл в Unix

Получая файл фиксированной длины из основного фрейма для одного конкретного атрибута, я получаю ненужный символ, поэтому время, когда этот мусорный символ читается как символ новой строки, в результате все данные были испорчены.

Пример данных в файле

0401000000030020170628000000710000366400201706280002750035*T000100N▒101892928550383900000009201 00000000000008402017062800000020  0000006435000000000000000840A1E098D09D9279BE4000561510A00003220000000000000000000000FF

0401000000030020170628000000710000365400201706280001041125
T000100N▒101909856755446700000018201 00000000000008402017062800000000  00000067540000000000000008402ED730917E9D1DC040000B0810A04003240000000000000000000000FF

Первая запись правильная, хотя я получаю ненужный символ * T000100N▒ , но для второй записи T000100N▒ нежелательный символ читается как новый строчный символ.

-2
19.07.2017, 09:17
1 ответ

В вашем примере sedудается:

sed '/^.\{216\}$/!N;s/./?/59' file

Адрес /^.\{216\}$/!выполняет следующую команду в строках, которые не имеют необходимой длины в 216 символов. В этом случае мы предполагаем, что строка разделена, поэтому Nсчитывает оставшуюся часть строки.

Затем команда sзаменяет 59-й символ этой записи (либо *, либо новую строку знаком вопроса (измените это, как вам нужно ).

Это работает для вашего примера, но я не уверен, что некоторые другие случайные байты или многобайтовые символы -сломают сценарий.

Итак, если sedне работает во всех случаях, используйте хороший инструмент под названием bbe, который идеально подходит для обработки записей фиксированной -длины, включая двоичные данные:

bbe -b ":219" -e 'r 58 ?' file

-b ":219"определяет размер блока как 219 (, включая новую строку и многобайтовый -символ ), а r 58 ?заменяет байт по смещению 58 (, так что это 59-й символ )со знаком вопроса.

0
28.01.2020, 05:17

Теги

Похожие вопросы