![удаление возврата каретки 0d из файла .csv](https://rvso.com/image/109230/%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%D0%B0%20%D0%BA%D0%B0%D1%80%D0%B5%D1%82%D0%BA%D0%B8%200d%20%D0%B8%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%20.csv%20.png)
работая со скриптом у меня возникла следующая проблема. В большинстве случаев при запуске скрипта я получаю следующий выходной файл:
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
, которая отсутствует в вашем случае.