Автор Тема: awk и xml главоблъсканица  (Прочетена 2756 пъти)

martos

  • Напреднали
  • *****
  • Публикации: 110
    • Профил
    • WWW
awk и xml главоблъсканица
« -: Jul 31, 2013, 17:07 »
Здравейте,

Опитвам се да променя старт и стоп тайм-а в един xmltv файл - да увелича с един час и да добавя тайм офсет:

оригинал:
Код:
<programme channel="tv.tv" start="20130731213000" stop="20130731223000">
<title>Some title</title>
</programme>

желан резулта:
Код:
<programme channel="tv.tv" start="20130731223000 +0200" stop="20130731233000 +0200">
<title>Some title</title>
</programme>

awk не ми е силата, та ще съм признателен ако ударите едно рамо :)
Активен

laskov

  • Напреднали
  • *****
  • Публикации: 3166
    • Профил
Re: awk и xml главоблъсканица
« Отговор #1 -: Jul 31, 2013, 17:35 »
И защо не го направиш с текстов редактор?
Активен

Не си мислете, че понеже Вие мислите правилно, всички мислят като Вас! Затова, когато има избори, идете и гласувайте, за да не сте изненадани после от резултата, и за да не твърди всяка партия, че тя е спечелила, а Б.Б. (С.С., ...) е загубил, а трети да управлява.  Наздраве!  [_]3

solarflux

  • Напреднали
  • *****
  • Публикации: 100
    • Профил
Re: awk и xml главоблъсканица
« Отговор #2 -: Jul 31, 2013, 19:22 »
Мно грозно

echo '<programme channel="tv.tv" start="20130731213000" stop="20130731223000">' | awk '{print $1 " " $2 " " substr($3, 1 ,16) (substr($3,17,1)+1) substr($3, 18, 4)  " +0200\" " substr($4, 1, 15) (substr($4, 16, 1) + 1) substr($4, 17, 4) " +0200\">" }'                                 

<programme channel="tv.tv" start="20130731223000 +0200" stop="20130731233000 +0200">
желан резултат:
<programme channel="tv.tv" start="20130731223000 +0200" stop="20130731233000 +0200">

натам ме мързи да се занимавам но можеш да си направиш скриптче, дето с помощта на грепове да преценява дали редът започва с ^<programme и да го прекарва през аук-а и да го драска във файл, а ако не - да го драска във файл директно...
Активен

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: awk и xml главоблъсканица
« Отговор #3 -: Jul 31, 2013, 22:17 »
solarflux, така няма да стане с такова сумиране на числата. Ако часът е 19:30, с такова сумиране ще стане 110:30. Това може да се избегне, като се понаместят обхватите на substr функциите, но това не решава другият проблем - преминаване към следваща дата, когато часът надхвърли 23:59.

martos, ще ти свърши ли работа такъв ред
Код
GeSHi (Bash):
  1. awk 'BEGIN { FS = "\""; OFS="\""}; { for (i=4; i<=NF; i++) { if($i ~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/) { split($i, a, ""); $i = strftime("%Y%m%d%H%M%S +0200", mktime(a[1]a[2]a[3]a[4]" "a[5]a[6]" "a[7]a[8]" "a[9]a[10]" "a[11]a[12]" "a[13]a[14])+3600); };}; print}' име_на_файла
Ако часовата разлика не трябва да е статично забита, а трябва да е текущата часова разлика, която използва системата, замени "+0200" с "%z". Във for-а тръгвам от "i=4", тъй като първото срещане на число за промяна в реда е на 4-то място, вземайки се предвид кавичките за разделител. Може да го намалиш, ако в цялостния XML файл ще имаш срещания и на по-предни места. Освен това, скриптът ще заменя всички стрингове, състоящи се само от цифри и дълги 14 символа. Ако в XML файла ще имаш и други стрингове, състоящи се само от цифри и дълги 14 символа, които не трябва да бъдат заменяни, ще имаш проблем.
В if-а би било по-добре да се напише [0-9]{14}, вместо тази дълга поредица от 14 отделни диапазона, обаче нещо не успях да накарам awk да реагира на такъв указател. Може да се ползва [0-9]+ за по-кратко, но така се рискува прихващане и на други стрингове, състоящи се само от цифри, които не са с дължина 14 символа.

П.П.: А, да! Ако ти даде грешка за strftime, инсталирай си gawk - функцията пристига с него, но след това можеш да си я ползваш и в awk.
« Последна редакция: Jul 31, 2013, 22:31 от neter »
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

Demayl

  • Напреднали
  • *****
  • Публикации: 104
  • Distribution: XUbuntu,FreeBSD
  • Window Manager: Xfce
    • Профил
    • WWW
Re: awk и xml главоблъсканица
« Отговор #4 -: Jul 31, 2013, 23:19 »
Ето ти на perl ( regex-a на awk ще е подобен )
Код
GeSHi (Perl):
  1. perl -pi -e's/(?:(?<=start=")|(?<=stop="))(\d+)/($1+10000)." +0200"/ges' test.xml
като накрая си слагаш името на твоя файл и виждаш къде е +0200 зада го смениш с каквото искаш
Активен

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Re: awk и xml главоблъсканица
« Отговор #5 -: Jul 31, 2013, 23:55 »
[...]
В if-а би било по-добре да се напише [0-9]{14}, вместо тази дълга поредица от 14 отделни диапазона, обаче нещо не успях да накарам awk да реагира на такъв указател.

При GNU awk < 4, можеш да използваш --re-interval (или --posix),
за да активираш interval expressions (при GNU awk >= 4 са enabled by default). 

Цитат
П.П.: А, да! Ако ти даде грешка за strftime, инсталирай си gawk - функцията пристига с него, но след това можеш да си я ползваш и в awk.

Защото след инсталирането awk ще е вече GNU awk (gawk).
Активен

kifavi8024

  • Новаци
  • *
  • Публикации: 0
    • Профил
Re: awk и xml главоблъсканица
« Отговор #6 -: Jul 31, 2013, 23:55 »
//OFF-topic: Не знам за awk, ама xml-a на SMF е супер дървена работа, няма опция за мулти-actions и това е супер кофти, защото трябва да правиш copy-paste за custom themes...
Активен

martos

  • Напреднали
  • *****
  • Публикации: 110
    • Профил
    • WWW
Re: awk и xml главоблъсканица
« Отговор #7 -: Aug 01, 2013, 10:27 »
Големи благодарности на всички!  :)
Със сигурност ми спестихте часове борба :)
Решението на Neter ме устройва най-много и ще ползвам него. Още веднъж благодаря! :)
Активен