при выгрузке случился баг и после 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).
Комментариев нет:
Отправить комментарий