удаление возврата каретки 0d из файла .csv

удаление возврата каретки 0d из файла .csv

работая со скриптом у меня возникла следующая проблема. В большинстве случаев при запуске скрипта я получаю следующий выходной файл:

device_id,ip_address,serial_number
 SEP0c1167231746, 148.000.000.32
 SEP0c1167223fa5, 148.000.000.30
 SEP0c1167224170, 148.000.000.30
 SEP0c1167231d2e, 148.000.000.194
 SEP0c1167233b9f, 148.000.000.31
 CUV, 148.000.000.254
 SEP0c1167231d32, 148.000.000.34
 SEP501cbffcfa9c, 148.000.000.24
 SEP00082fb67d5f, 148.000.000.21
 SEP00082fb67701, 148.000.000.22

И это именно то, чего я ожидаю, но иногда файл выглядит вот так:

device_id,ip_address,serial_number
 SEP0c1167231746
, 148.000.000.32
 SEP0c1167223fa5
, 148.000.000.30
 SEP0c1167224170
, 148.000.000.30
 SEP0c1167231d2e
, 148.000.000.194
 SEP0c1167233b9f
, 148.000.000.31
 CUV
, 148.000.000.254
 SEP0c1167231d32
, 148.000.000.34
 SEP501cbffcfa9c
, 148.000.000.24
 SEP00082fb67d5f
, 148.000.000.21
 SEP00082fb67701
, 148.000.000.22

Я пытался выяснить, что происходит, но, похоже, это не является чем-то обычным. Теперь я хочу разобраться только с этим. С помощью Ghex я определил символ, который вызывает проблему.

введите описание изображения здесь

Теперь я хотел бы заменить все «0D» на Null и оставить все «0A».

Просто в качестве примечания: я пробовал использовать «dos2unix», но это не сработало.

Не могли бы вы помочь мне?

ОБНОВЛЕНИЕ: Используем: sed -n -e '/,/!{N;s/\n//;}; /,/p' ввод

с таким файлом:

device_id,ip_address,serial_number
 SEP0c1167231746
, 148.000.000.32
,
 SEP0c1167223fa5
, 148.000.000.30
,
 SEP0c1167224170
, 148.000.000.30
,
 SEP0c1167231d2e
, 148.000.000.194
,
 SEP0c1167233b9f
, 148.000.000.31
,
 CUV
, 148.000.000.254
,
 SEP0c1167231d32
, 148.000.000.34
,
 SEP501cbffcfa9c
, 148.000.000.24
,
 SEP00082fb67d5f
, 148.000.000.21
,
 SEP00082fb67701
, 148.000.000.22

У меня получился такой вывод:

, 148.000.000.32
, 148.000.000.30
, 148.000.000.30
, 148.000.000.194
, 148.000.000.31
, 148.000.000.254
, 148.000.000.34
, 148.000.000.24
, 148.000.000.21
, 148.000.000.22

решение1

Возможно, есть лучший sedвариант, но вот один из них:

sed -n -e '/,/!{N;s/\n//;}; /,/p' input > output

Там написано (по умолчанию, не печатая строки): если в строке есть запятая, то прочитайтеследующийline in и замените символ новой строки. Затем, если в строке есть (сейчас или уже) запятая, вывести строку. Он читает из inputи пишет в output. С некоторыми sed вы можете использовать флаг sed -iдля редактирования файла на месте.

Пример ввода:

device_id,ip_address,serial_number
 SEP0c1167231746, 148.000.000.32
 SEP0c1167223fa5, 148.000.000.30
 SEP0c1167231746
, 148.000.000.32
 SEP0c1167223fa5
, 148.000.000.30

Пример вывода:

device_id,ip_address,serial_number
 SEP0c1167231746, 148.000.000.32
 SEP0c1167223fa5, 148.000.000.30
 SEP0c1167231746, 148.000.000.32
 SEP0c1167223fa5, 148.000.000.30

решение2

Глядя на ваш hexdump, можно предположить, что это должно решить вашу проблему:

tr -d '\015' < input > log

Так как восьмеричное число \015— это carriage return ^Mсимвол.

Почему dos2unixэто не помогло, так это потому, что dos2unixрассматривается последовательность \r\n, которая отсутствует в вашем случае.

Связанный контент