#bash #sed
при выгрузке случился баг и после data3 добавился знак переноса строки \n и все сьехало на две строки. 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 заранее спасибо
Ответы
Ответ 1
Попробуйте sed 'N;s/\n"/"/' У меня вроде работает: [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/\n"/"/' xx.txt data1,data2,"data3",data4 data1,data2,"data3",data4 data1,data2,"data3",data4 Для более сложных случаев (возможны «обыкновенные» строки) попробуйте так: sed '/^",/{H;x;s/\n//;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/\n//;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/\n//;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), чтобы можно было обработать текст. Удаляем \n (s/\n//), и отправляем назад строку в hold space, чтобы проанализировать и вывести её на следующем цикле. Обрубок строки, который получился в pattern space, удаляем, и завершаем эту итерацию (d).Ответ 2
если структура получившегося файла точно соответстует приведённому примеру (надо объдинить 1 и 2 строку, 3 и 4 и т.д.), то выражение можно упростить, примерно как в соседнем ответе: $ cat старый.файл | sed 'N;s/\n//' > новый.файл объяснение: для всех нечётных строк будет: прочитана следующая строка в конец pattern space из pattern space будет удалён символ перевода строки \n между этими двумя строкамиОтвет 3
Мне проще написать такое на sh (или Си). Объединяем строки, если после заданного текста был вставлен \n : avp@avp-xub11:hashcode$ cat ts.sh #!/bin/sh IFS="" while read -r s1 do if echo $s1 | grep $1'$' >/dev/null ; then echo -n $s1 else echo $s1 fi done avp@avp-xub11:hashcode$ cat ttt header data1,data2,"data3 ",data4 intermediate data data1,"data2 ","data3 ",data4 data1,data2,"data3 ",data4 data1,"data3 " "data3 "data3 "data4 tailer avp@avp-xub11:hashcode$ ./ts.sh \"data3 < ttt header data1,data2,"data3",data4 intermediate data data1,"data2 ","data3",data4 data1,data2,"data3",data4 data1,"data3" "data3 "data3"data4 tailer avp@avp-xub11:hashcode$ IFS="" заставляет sh (или bash) не разбивать строку на слова, а ключ -r говорит read, что backslash это обычный символ (см. man 1 read).Ответ 4
тут может попробуете команду tr ? tr '\n\",' ",' < input_filename sed хорошо, но советуют tr версия для sed sed ':a;N;$!ba;s/\",\n/\",/g' file :a создание метки 'a' N добавить следующую строку в формат $! если не конец строки переход в метку 'a' s substitute, /\",n/ regex для кавычки-запятой-новой_строки, /\",/ заменить с кавычки-запятой, /g замена глобальная (сколько раз есть, столько работай)
Комментариев нет:
Отправить комментарий