LINUX.ORG.RU

Вопрос по sed/awk

 , ,


0

3

Как удалить кавычки между кавычками? т.е. допустим есть файл:

"300029","11.04.2013 23:20:00","7500","Роберт Де Ниро,Гвинет Пэлтроу в фильме "Большие надежды".",""
"300029","13.04.2013 15:25:00","2100",""Обратный отсчет". "Белорусский космос. Секретная тема".",""
"300029","13.04.2013 08:00:00","3600","Наши новости.",""

Его нужно привести к такому виду:

"300029","11.04.2013 23:20:00","7500","Роберт Де Ниро,Гвинет Пэлтроу в фильме Большие надежды.",""
"300029","13.04.2013 15:25:00","2100","Обратный отсчет. Белорусский космос. Секретная тема.",""
"300029","13.04.2013 08:00:00","3600","Наши новости.",""

Ответ на: комментарий от anonymous

а вообще хреновый csv: внутри поля они должны быть экранированы

anonymous ()
Ответ на: комментарий от anonymous

sed -r 's/([^,])"([^,])/\1\2/g'

но это не надежно, ибо изначально формат похерен

anonymous ()
awk -F\, '{gsub(/\"/,"",$4) ; print $1","$2","$3",\""$4"\""}'
yozan ()

Вот тебе и awk, и sed в одном флаконе.

input.txt - оригинал

output.txt - результат

$ Z=`date | sha1sum | awk '{print $1;}'`; sed "s/\",\"/$Z/g; s/\"//g; s/$Z/\",\"/g; s/^/\"/; s/$/\"/;" input.txt > output.txt

justAmoment ★★★★★ ()

Как удалить кавычки между кавычками

ты имеешь ввиду, что внутри кавычек нет запятых? Если есть - никак в принципе.

drBatty ★★ ()

«300029»,«11.04.2013 23:20:00»,«7500»,«Роберт Де Ниро,Гвинет Пэлтроу в фильме „Большие надежды“.»,«»

в данном конкретном случае надо отрезать

"Роберт Де Ниро,Гвинет Пэлтроу в фильме "Большие надежды"."
и удалить(экранировать) оттуда все кавычки.

Это надо делать ДО того, как ты всё это в одну строчку вбил.

ещё можно в качестве разделителя использовать что-то, чего НЕ МОЖЕТ быть в строке. Например \n, или скажем ☭ (если это выхлоп сайта в cp1251, там такого нету гарантированно)

drBatty ★★ ()
Ответ на: Вот тебе и awk, и sed в одном флаконе. от justAmoment

Далее обработка коллизий.

1) Лишние вхождения комбинации символов «кавычки-запятая-кавычки» в названии.

образец:

$ cat input.txt 
"300029","11.04.2013 23:20:00","7500",""Роберт Де Ниро","Гвинет Пэлтроу" в фильме "Большие надежды".",""
"300029","13.04.2013 15:25:00","2100",""Обратный отсчет". "Белорусский космос. Секретная тема".",""
"300029","13.04.2013 08:00:00","3600","Наши новости.",""

Новый скрипт (обрабатывает три первых и последнее вхождения):

Z=`date | sha1sum | awk '{print $1;}'`; sed "s/\",\"/$Z/; s/\",\"/$Z/; s/\",\"/$Z/; s/\(.*\)\",\"/\1$Z/; s/\"//g; s/$Z/\",\"/g; s/^/\"/; s/$/\"/;" input.txt > output.txt

2) Можно ли использовать временный разделитель полей «$Z» в данном конкретном тексте.

Новый скрипт (проверяем вхождение «$Z» в input.txt):

Z="0"; while [ `grep $Z input.txt | wc -l` -gt 0 ]; do echo "bad delimiter "$Z; Z=__`echo \`date\`$RANDOM | sha1sum | awk '{print $1;}'`_; done; echo "good delimiter "$Z; sed "s/\",\"/$Z/; s/\",\"/$Z/; s/\",\"/$Z/; s/\(.*\)\",\"/\1$Z/; s/\"//g; s/$Z/\",\"/g; s/^/\"/; s/$/\"/;" input.txt > output.txt

justAmoment ★★★★★ ()
Ответ на: комментарий от drBatty

Если есть - никак в принципе.

Достаточно чтобы не встречалось

","
. Отдельные запятые не принципиальны. Но да, лучше править код, что нагенерил недо-csv.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.