Страницы

Поиск по вопросам

понедельник, 13 мая 2019 г.

Удаление знаков переноса с возвратом строки

при выгрузке случился баг и после data3 добавился знак переноса строки
и все сьехало на две строки. data3 обрамлен " (двойные ковычки) файл очень большой 1 мил строк и в ручную не вариант переделывать подскажите как через sed убрать перенос строки для того чтобы сьехавший хвост вытянулся в одну строку сейчас файл имеет такой вид
data1,data2,"data3 ",data4 data1,data2,"data3 ",data4 data1,data2,"data3 ",data4
а должен быть таким
data1,data2,"data3",data4 data1,data2,"data3",data4 data1,data2,"data3",data4
заранее спасибо


Ответ

Попробуйте
sed 'N;s/
"/"/'
У меня вроде работает:
[VladD@Kenga] [00:59:25] [~] {0,504}$> cat xx.txt data1,data2,"data3 ",data4 data1,data2,"data3 ",data4 data1,data2,"data3 ",data4
[VladD@Kenga] [00:59:32] [~] {0,505}$> sed 'N;s/
"/"/' xx.txt data1,data2,"data3",data4 data1,data2,"data3",data4 data1,data2,"data3",data4
Для более сложных случаев (возможны «обыкновенные» строки) попробуйте так:
sed '/^",/{H;x;s/
//;x;d}; x' | sed '1d'
Проверка:
[VladD@Kenga] [01:35:47] [~] {0,539}$> cat xx.txt header "data1",data2,"data3 ",data4 intermediate data data1,"data2 ","data3 ",data4 data1,data2,"data3 ",data4
[VladD@Kenga] [01:35:52] [~] {0,540}$> sed '/^",/{H;x;s/
//;x;d}; x' xx.txt
header "data1",data2,"data3",data4 intermediate data data1,"data2","data3",data4 data1,data2,"data3",data4
[VladD@Kenga] [01:35:57] [~] {0,541}$> sed '/^",/{H;x;s/
//;x;d}; x' xx.txt | sed '1d' header "data1",data2,"data3",data4 intermediate data data1,"data2","data3",data4 data1,data2,"data3",data4
Внимение: последняя строка должна заканчиваться переводом строки, иначе она будет «проглочена»!

Объяснение: нам необходимо, когда мы видим строку, начинающуюся с кавычки, знать предыдущую строку, чтобы склеить их. Для этого мы «задерживаем» вывод строк, отправляя их в hold space вместо вывода, и выводя вместо этого предыдущую строку, лежащую там же (x).
Для случая, когда строка начинается с кавычки (/^"/) начинаем действовать. В hold space лежит предыдущая строка, пристыковываем к ней текущую (H), и обмениваем hold space с pattern space (x), чтобы можно было обработать текст. Удаляем
(s/
//), и отправляем назад строку в hold space, чтобы проанализировать и вывести её на следующем цикле. Обрубок строки, который получился в pattern space, удаляем, и завершаем эту итерацию (d).

Комментариев нет:

Отправить комментарий