LINUX.ORG.RU
ФорумAdmin

Помогите написать скрипт обработки логов

 , ,


0

3

Есть такой файл

01/01/2013;00:01:49;-;-;401911;-;9911;00:00:00;16
01/01/2013;00:01:53;-;-;401911;-;401991;00:00:00;16
01/01/2013;00:01:57;-;-;401911;-;401876;00:00:00;16
01/01/2013;00:02:01;-;-;401911;-;401901;00:00:00;16
01/01/2013;00:02:06;-;-;401911;-;401883;00:00:00;16
01/01/2013;00:01:51;1105211;-;9145075624;-;400250;00:02:59;16
01/01/2013;00:02:10;-;-;401911;-;401884;00:00:00;16
01/01/2013;00:04:25;1105101;-;9145251919;-;401911;00:00:00;16
01/01/2013;00:02:14;-;-;401911;-;401886;00:00:00;16
01/01/2013;00:02:29;-;-;400299;-;400316;00:00:00;16
01/01/2013;00:03:11;-;-;401911;-;9911;00:00:00;16
и недоработанный скрипт мне нада чтобы дата была в формате Wed 12 Dec 2012 для этого есть команда date --date 12/12/2012 '+%a %d %b %Y' разбираю построчно awkом добавляю то что нужно а вот с датой беда как мне прикрутить к AWK команду date для переменной $1

как мне прикрутить к AWK команду date для переменной $1

если я правильно понял, как-то так:

$ d=`date --date 12/12/2012 '+%a %d %b %Y'`
$ awk -v date=$d 'BEGIN { print date; }'

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

нет немного не так мне надо чтобы дата каждой строчки перешла в формат Wed 12 Dec 2012 а все оставшиеся остались т.е. Было 01/01/2013;00:01:49;-;-;401911;-;9911;00:00:00;16 Стало Wed 01 Jan 2013;00:01:49;-;-;401911;-;9911;00:00:00;16

команда date --date 12/12/2012 '+%a %d %b %Y' это просто пример вместо 12/12/2012 должно подставлятmся $1 и писатся в файл вся строка

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

Мой скрипт тока надо придумать как обработать $1

#!/bin/bash

file=«voip.cdr» logf=«log_rabot.cdr» result=«result.cdr»

:>${file} :>${logf} :>${result}

for a in *.log; do cat ${a} >> ${file} echo «Slit fail ${a}» >> ${logf} done

awk -F";" ' { print ( $2".000 UTC «$1»;«$3»;«$4»;«$5»;«$6»;«$7»;«$8»;«$9 ) }' ${file} >> ${result}

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

Так?

#!/bin/bash

while read line
do
    old_date=`echo $line | cut -d ';' -f 1`
    new_date=`date --date=$old_date '+%a %d %b %Y'`

    echo ${new_date}${line:${#old_date}};
done < 1.txt

neversleep ★★ ()

на вскидку без перла, седа, авк, питона:

 while read line; do echo ${line/${line/;*}/$(date --date ${line/;*} '+%a %d %b %Y')}; done < filename
Ip0 ★★★★ ()
export LANG=C
echo '01/01/2013;00:02:14;-;-;401911;-;401886;00:00:00;16 01/01/2013;00:02:29;-;-;400299;-;400316;00:00:00;16 ' | awk -F\; '{cmd="date --date " $1 " \"+%a %d %b %Y\""; cmd | getline newdate; print newdate }'

Как-то так

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

Стало Wed 01 Jan 2013

Вот варант на awk без внешней команды date, т.к. awk сам умеет работать с датами. Но ваша магия мне не понятна, если 12 декабря 2012 действительно было средой, то 1 января 2013 года было вторником, а не средой.

Я тут наставил переносов строк, чтобы было проще читать, так весь awk-скрипт идёт одной строкой или его можно поместить в отдельный файл:

 echo -e '12/12/2012;00:02:14;-;-;401911;-;401886;00:00:00;16\n01/01/2013;00:02:29;-;-;400299;-;400316;00:00:00;16 ' \|
awk '{i=index($0, ";");
     ndt=substr($0,1,i-1);
     rst=substr($0,i+1);
     split(ndt, a, "/");
     adt=strftime("%a %d %b %Y", mktime(a[3] " " a[2] " " a[1] " 0 0 0 0"));
     printf "%s;%s\n", adt, rst; }'
И я не знаю, где у вас там месяц, а где число, может нужно будет в mktime поменять местами ″a[2]″ и ″a[1]″.

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

Спасибо большее за подсказки готовый скрипт выглядит так: #!/bin/bash

file=«voip.cdr» main=«s_voip.cdr» analiz=«anal_iz.cdr» analiz_dlina=«analiz_dlina.cdr» file_konec=«konec.cdr» skolko=«0» logf=«log_rabot» resultat=«resultat.cdr» result=«result.cdr»

function date_format { :>${file} :>${logf} :>${resultat}

for a in *.log; do cat ${a} >> ${file} echo «Slit fail ${a}» >> ${logf} done awk -F"." ' {print ($2"/«$1»/«$3) }' ${file} >> ${resultat} }

function Format_Zvon { :>${file} :>${logf} :>${result}

for a in resultat.cdr; do cat ${a} >> ${file} echo „Slit fail ${a}“ >> ${logf} done LANG=en_US.utf8 awk -F\; '{cmd=„date --date “ $1 » \«+%a %b %d %Y\»"; cmd | getline newdate; print $2".000 UTC «newdate»;«$5»;«$7»;«$8 }' ${file} >> ${result} } #function time_to_length { #:>${analiz_dlina} #for a in result.cdr # do # cat ${a} >> ${file} # echo „Preobrazuem vremya razgovora to seconds“ >> ${logf} # done #awk -F\; '{cmd"date +%s -d » «\„1970-01-01 “$4"GMT \»"; cmd | getline newdate; print $1";«$2»;«$3»;«$4 # }' ${file} >> ${analiz_dlina} #}

function time_to_length { :>${analiz_dlina} cat ${result} | while read line do vremya_razg=»`echo ${line} | awk -F";" '{print ($4)}'`" dlina_razgovora=«`date -d „1970/01/01 ${vremya_razg} GMT“ »+%s"`" minut=print int ${dlina_razgovora}/60 res=«`echo ${line} | awk -F»;" '{print ($1";«$2»;«$3»;")}'`" echo ${res}${minut} echo ${res}${minut} >> ${analiz_dlina} done date_format Format_Zvon time_to_length

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

Теперь необходимо Округлить десятичное число в большую сторону minut=«`echo »${dlina_razgovora}/60" | bc`" если делаю так то округляет в меньшую сторону

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

Скрипт

#!/bin/bash

file=«voip.cdr»

main=«s_voip.cdr»

analiz=«anal_iz.cdr»

analiz_dlina=«analiz_dlina.cdr»

file_konec=«konec.cdr»

skolko=«0»

logf=«log_rabot»

resultat=«resultat.cdr»

result=«result.cdr»

function date_format {

:>${file}

:>${logf}

:>${resultat}

for a in *.log;

do

cat ${a} >> ${file}

echo «Slit fail ${a}» >> ${logf}

done

awk -F"." '

{print ($2"/«$1»/«$3)

}' ${file} >> ${resultat}

}

function Format_Zvon {

:>${file}

:>${logf}

:>${result}

for a in resultat.cdr;

do

cat ${a} >> ${file}

echo „Slit fail ${a}“ >> ${logf}

done

LANG=en_US.utf8

awk -F\; '{cmd=„date --date “ $1 » \«+%a %b %d %Y\»"; cmd | getline newdate; print $2".000 UTC «newdate»;«$5»;«$7»;«$8

}' ${file} >> ${result}

}

function time_to_length {

:>${analiz_dlina}

cat ${result} | while read line

do

vremya_razg=»`echo ${line} | awk -F";" '{print ($4)}'`"

dlina_razgovora=«`date -d „1970/01/01 ${vremya_razg} GMT“ »+%s"`"

minut=«`echo »${dlina_razgovora}/60" | bc`"

res=«`echo ${line} | awk -F»;" '{print ($1";«$2»;«$3»;")}'`"

echo ${res}${minut}

echo ${res}${minut} >> ${analiz_dlina}

done

}

date_format

Format_Zvon

time_to_length

AHTOH1100 ()
Ответ на: Скрипт от AHTOH1100

Так было бы удобнее и вам и другим:

[code=bash]Ваш код здесь[/code]

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

а зачем +59

Арифметика баша выдаёт целую часть при делении, если прибавишь 59 к 61 секунде получишь 120, то есть две минуты, если к 60 секундам, то 119, что округлится до одной минуты. Правда обычно есть порог около 5 секунд, в течение которого минута не тратится, возможно следует его учитывать.

И да, готовые скрипты без [code] не читаются.

Xenius ★★★★★ ()
Последнее исправление: Xenius (всего исправлений: 2)
Ответ на: комментарий от AHTOH1100

100 сек bc округляет как 2 мин

Если в вашей минуте 50 секунд, а не 60 (что объясняет, почему у вас первое января 2013 года это среда), то прибавляйте не 59, а 49.

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

про среду это я от балды написал а про 59 сек просто уменьшил до 57 и округлил как надо спасибо ребят учту все замечания просто в работе с ОС Linux я дилетант готовый скрипт выложу как надо.

AHTOH1100 ()
Ответ на: комментарий от AHTOH1100
 
file="voip.cdr"
main="s_voip.cdr"
analiz_dlina="analiz_dlina.cdr"
file_konec="konec.cdr"
skolko="0"
logf="log_rabot"
resultat="resultat.cdr"
result="result.cdr"
shluz="shluz.cdr"

function date_format {
:>${file}
:>${logf}
:>${resultat}

for a in *.log;                                                      
  do
    cat ${a} >> ${file}
    echo "Slit fail ${a}" >> ${logf}
  done
awk -F"." '
{print ($2"/"$1"/"$3)
  }' ${file} >> ${resultat}
}

function Format_Zvon {
:>${file}
:>${logf}
:>${result}

for a in resultat.cdr;                                                      
 do
    cat ${a} >> ${file}
    echo "Slit fail ${a}" >> ${logf}
 done
LANG=en_US.utf8
awk -F\; '{cmd="date --date " $1 " \"+%a %b %d %Y\""; cmd | getline newdate; print $2".000 UTC "newdate";"$5";"$7";"$8
  }' ${file} >> ${result}
}

function shluz {
:>${file}
:>${logf}
:>${shluz}

for a in result.cdr;                                                      
  do
    cat ${a} >> ${file}
    echo "Slit fail ${a}" >> ${logf}
  done
awk -F";" '{
 if (( $3 ~ /^[0-9][0-9][0-9][0-9]$/ )) { print  ( $1";"$2";40"$3";"$4";"$5) } 
 if (( $3 ~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/ )) { print  ( $1";"$2";8"$3";"$4";"$5) } 
 if (( $2 ~ /^[0-9][0-9][0-9][0-9]$/ )) { print  ( $1";40"$2";"$3";"$4";"$5) } 
 if (( $2 ~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/ )) { print  ( $1";8"$2";"$3";"$4";"$5) } 
else { print  ( $1";"$2";"$3";"$4";"$5) }


  }' ${file} >> ${shluz}
}

function time_to_length {
  :>${analiz_dlina}
  cat ${shluz} | while read line
  do
    vremya_razg="`echo ${line} | awk -F";" '{print ($4)}'`"
    dlina_razgovora="`date -d "1970/01/01 ${vremya_razg} GMT" "+%s"`"
    minut="`echo "(${dlina_razgovora}+57)/60" | bc`"
    res="`echo ${line} | awk -F";" '{print ($1";"$2";"$3";")}'`"
    echo ${res}${minut}
    echo ${res}${minut} >> ${analiz_dlina}
  done
}
date_format
Format_Zvon
shluz
time_to_length
[bash]
AHTOH1100 ()
Ответ на: комментарий от AHTOH1100
awk -F";" '{
 if (( $3 ~ /^[0-9][0-9][0-9][0-9]$/ )) { print  ( $1";"$2";40"$3";"$4";"$5) } 
 if (( $3 ~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/ )) { print  ( $1";"$2";8"$3";"$4";"$5) } 
 if (( $2 ~ /^[0-9][0-9][0-9][0-9]$/ )) { print  ( $1";40"$2";"$3";"$4";"$5) } 
 if (( $2 ~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/ )) { print  ( $1";8"$2";"$3";"$4";"$5) } 


и вот еще как мне объединить все 4 условия при таком варианте скрипт найдя один из условий в строке заменяет его и переходит на следующую строку пропуская остальные условия можно конечно добавить еще 3 awk и там разобрать
AHTOH1100 ()
Ответ на: комментарий от AHTOH1100

c условиями разобрался остался еще один вопрос как AWK перевести 00:02:12 в секуды пробовал вариант

awk -F";" '{cmd="date --date \" $4 " \"+%s\""; cmd | getline newdate; print $1";"$2";"$3";"newdate
при этом к времени добавляю 1970/01/01 00:02:12 GMT пробовал в консоли отрабатывает а в awk не желает

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

Каждую строку через пайп передавать, не?

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

Было так но это очень долго в файле оч много строк )))


}

function time_to_length {
  :>${analiz_dlina}
  cat ${shluz} | while read line
  do
    vremya_razg="`echo ${line} | awk -F";" '{print ($4)}'`"
    dlina_razgovora="`date -d "1970/01/01 ${vremya_razg} GMT" "+%s"`"
    minut="`echo "(${dlina_razgovora}+57)/60" | bc`"
    res="`echo ${line} | awk -F";" '{print ($1";"$2";"$3";")}'`"
    echo ${res}${minut}
    echo ${res}${minut} >> ${analiz_dlina}
  done
}
[\bash]
AHTOH1100 ()

т.е скрипт находил в каждой строке нужное дорабатывал до Unix time и командой date считал сек

а я хочу доработать чтоб было быстрее для этого беру awk

function time_to_length {
:>${file}
:>${logf}  
:>${analiz_dlina}
for a in shluz3.cdr;
  do
   cat ${a} >> ${file}
   echo "Slit fail {$a}" >> ${logf}
  done
awk -F";" '{cmd="date --date "$4" \"+%s\""; cmd | getline newdate; print $1";"$2";"$3";"newdate
  }' ${file} >> ${analiz_dlina}
}

вот теперь надо $4 добить до Unix time формат $4 -> 00:01:11 надо добавить 1970/01/01 $4 UTC и потом в AWK выполнить

date --date '1970/01/01 $4 UTC' +%s

и он отдаст $4 в сек. А беда вся в том что я немогу справится с синтаксисом

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

Что-то ты какую-то жесть пишешь.

Почему /^[0-9][0-9][0-9][0-9]$/ а не просто /^[0-9]{4}/ например?

Почему вообще не сделать всё на awk или вообще не Tcl каком-нибудь?

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

Файлы

Исходный

01.09.2014;00:00:15;2106425;;9144722913;-;400040;00:01:27;16

01.09.2014;00:03:39;;1105111;400164;-;411920;00:00:41;16

01.09.2014;00:04:35;2106405;;9145183070;-;400040;00:00:32;16

01.09.2014;00:04:58;;1105112;400164;-;411920;00:02:05;16

01.09.2014;00:05:07;1105119;;9145015188;-;400898;00:00:57;16

01.09.2014;00:07:09;2106523;;9143518898;-;400040;00:01:11;16

01.09.2014;00:07:23;1105117;;3022453453;-;400109;00:00:10;16

01.09.2014;00:07:33;2106511;;9243764369;-;400040;00:01:32;16

01.09.2014;00:11:30;2106519;;9243845939;-;400040;00:00:01;16

01.09.2014;00:14:45;2106529;;9144891185;-;400040;00:01:54;16

Результат

00:00:15.000 UTC Mon Sep 01 2014;;89144722913;400040;87;16

00:03:39.000 UTC Mon Sep 01 2014;1105111;400164;411920;41;16

00:04:35.000 UTC Mon Sep 01 2014;;89145183070;400040;32;16

00:04:58.000 UTC Mon Sep 01 2014;1105112;400164;411920;125;16

00:05:07.000 UTC Mon Sep 01 2014;;89145015188;400898;57;16

00:07:09.000 UTC Mon Sep 01 2014;;89143518898;400040;71;16

00:07:23.000 UTC Mon Sep 01 2014;;83022453453;400109;10;16

00:07:33.000 UTC Mon Sep 01 2014;;89243764369;400040;92;16

00:11:30.000 UTC Mon Sep 01 2014;;89243845939;400040;1;16

00:14:45.000 UTC Mon Sep 01 2014;;89144891185;400040;114;16

AHTOH1100 ()
Ответ на: Файлы от AHTOH1100

Мой скрипт тока надо придумать как подругому обработать дату. В таком варианте дата обрабатывается если только она по порядку в файле

#!/bin/bash

file="voip.cdr"
main="s_voip.cdr"
analiz_dlina="analiz_dlina.cdr"
file_konec="konec.cdr"
skolko="0"
logf="log_rabot"
resultat="resultat.cdr"
result="result.cdr"
kat6="kat6.cdr"
shluz="shluz.cdr"
shluz1="shluz1.cdr"
shluz2="shluz2.cdr"
shluz3="shluz3.cdr"
SKtel="SKtel.cdr"

function date_format {
:>${file}
:>${logf}
:>${resultat}

for a in *.log;                                                      
  do
    cat ${a} >> ${file}
    echo "Slit fail ${a}" >> ${logf}
  done
awk -F"." '
{print ($2"/"$1"/"$3)
  }' ${file} >> ${resultat}
}

function kat6 {
:>${file}
:>${logf}
:>${kat6}

for a in resultat.cdr;                                                      
  do
    cat ${a} >> ${file}
    echo "Slit fail ${a}" >> ${logf}
  done
awk -F ";" '{ 
 if (($7 ~ /^[6][0-9]{10}$/)) {print ($1";"$2";"$3";"$4";"$5";"$6";"substr($7,2,10)";"$8";"$9)} 
else {print ($1";"$2";"$3";"$4";"$5";"$6";"$7";"$8";"$9)}
  }' ${file} >> ${kat6}
}

function Format_Zvon {
:>${file}
:>${logf}
:>${result}

for a in kat6.cdr;                                                      
 do
    cat ${a} >> ${file}
    echo "Slit fail ${a}" >> ${logf}
 done
LANG=en_US.utf8
#awk '{i=index($1, ";");
#     ndt=substr($1,1,i-1);
#     rst=substr($1,i+1);
#     split(ndt, a, "/");
#     adt=strftime("%a %d %b %Y", mktime(a[3] " " a[2] " " a[1] " 0 0 0 0"));
#     printf "%s;%s\n", adt, rst;";"$2" "$1;"$5";"$7";"$8
awk -F\; '{cmd="date --date " $1 " \"+%a %b %d %Y\""; cmd | getline newdate; print $2".000 UTC "newdate";"$4";"$5";"$7";:"$8":;"$9
  }' ${file} >> ${result}
}

function shluz {
:>${file}
:>${logf}
:>${shluz}

for a in result.cdr;                                                      
  do
    cat ${a} >> ${file}
    echo "Slit fail ${a}" >> ${logf}
  done
awk -F";" '{
 if (( $3 ~ /^[0-2][0-9][0-9][0-9]$/ )) { print  ( $1";"$2";40"$3";"$4";"$5";"$6 ) } 
else { print  ( $1";"$2";"$3";"$4";"$5";"$6 ) }


  }' ${file} >> ${shluz}
}

function shluz1 {
:>${file}
:>${logf}
:>${shluz1}

for a in shluz.cdr;                                                      
  do
    cat ${a} >> ${file}
    echo "Slit fail ${a}" >> ${logf}
  done
awk -F";" '{ 
 if (( $4 ~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/ )) { print  ( $1";"$2";"$3";8"$4";"$5";"$6 ) } 
else { print  ( $1";"$2";"$3";"$4";"$5";"$6 ) }


  }' ${file} >> ${shluz1}
}

function shluz2 {
:>${file}
:>${logf}
:>${shluz2}
for a in shluz1.cdr;                                                      
  do
    cat ${a} >> ${file}
    echo "Slit fail ${a}" >> ${logf}
  done
awk -F";" '{
 if (( $4 ~ /^[0-2][0-9][0-9][0-9]$/ )) { print  ( $1";"$2";"$3";40"$4";"$5";"$6 ) }  
else { print  ( $1";"$2";"$3";"$4";"$5";"$6 ) }


  }' ${file} >> ${shluz2}
}

function shluz3 {
:>${file}
:>${logf}
:>${shluz3}
for a in shluz2.cdr;                                                      
  do
    cat ${a} >> ${file}
    echo "Slit fail ${a}" >> ${logf}
  done
awk -F";" '{
 if (( $3 ~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/ )) { print  ( $1";"$2";8"$3";"$4";"$5";"$6 ) } 
else { print  ( $1";"$2";"$3";"$4";"$5";"$6 ) }


  }' ${file} >> ${shluz3}
}

function SKtel {
:>${file}
:>${logf}
:>${SKtel}
for a in shluz3.cdr;                                                      
  do
    cat ${a} >> ${file}
    echo "Slit fail ${a}" >> ${logf}
  done
awk -F";" '{
 if (( $4 ~ /^[0-9]{6}$/ )) { print  ( $1";"$2";"$3";83022"$4";"$5";"$6 ) } 
else { print  ( $1";"$2";"$3";"$4";"$5";"$6 ) }


  }' ${file} >> ${SKtel}
}

function time_to_length {
:>${file}
:>${logf}  
:>${analiz_dlina}
for a in SKtel.cdr;
  do
   cat ${a} >> ${file}
   echo "Slit fail {$a}" >> ${logf}
  done
awk -F":" '{ print $1":"$2":"$3""($4 * 3600) + ($5 * 60) + $6""$7
  }' ${file} >> ${analiz_dlina}
}
#  cat ${shluz3} | while read line
#  do
#    vremya_razg="`echo ${line} | awk -F";" '{print ()}"
#    dlina_razgovora="`date -d "1970/01/01 ${vremya_razg} GMT" "+%s"`"
#    #minut="`echo "(${dlina_razgovora}+57)/60" | bc`"
#    res=echo ${line} | awk -F";" '{print ($1";"$2";"$3";")}"
#    #echo ${res}${dlina_razgovora}
#    echo ${res}${dlina_razgovora} >> ${analiz_dlina}
# done
#}

#function summa_razgovora {
# :>${file_konec}
date_format
kat6
Format_Zvon
shluz
shluz1
shluz2
shluz3
SKtel
time_to_length
#summa_razgovora
[code\]
AHTOH1100 ()

[code\]

Ну [/code] же.

Файлы
Исходный

Ты бы ещё написал что во что должно преобразовываться — ну дата в другой формат, время в секунды и вообще значения всех полей.

Xenius ★★★★★ ()
Ответ на: Файлы от AHTOH1100

Re: Файлы

#!/usr/bin/python

import csv
from datetime import datetime, timedelta
import pytz

fin  = csv.reader(open('in.txt', 'r'), delimiter=';')
fout = csv.writer(open('out.txt', 'w'), delimiter=';')
for a0,a1,_,b,c,_,d,e,f in fin:
  a = datetime.strptime(a0+' '+a1, '%d.%m.%Y %H:%M:%S')
  a = a.replace(tzinfo=pytz.UTC)
  a = a.strftime('%H:%M:%S.000 %Z %a %b %d %Y')

  if len(c)==10:
    c = '8'+c

  e = datetime.strptime(e, '%H:%M:%S')
  e = timedelta(
    hours=e.hour,
    minutes=e.minute,
    seconds=e.second)
  e = e.seconds

  fout.writerow([a,b,c,d,e,f])
anonymous ()
Ответ на: Re: Файлы от anonymous

На Tcl то же самое получается проще:

#!/usr/bin/env tclsh
# convert logs from lor/admin/10940216

proc load_data {} {
	set infile stdin
	#set result {}
	foreach line [split [read -nonewline $infile] \n] {
		lassign [split $line \;] date time f3 f4 telnumber f6 f7 duration f9
		set newdate [clock format [clock scan "$date $time" -format {%d.%m.%Y %T} -timezone UTC] -format {%T.000 %Z %a %b %d %Y} -timezone UTC]
		lassign [split $duration :] h m s
		set duration_sec [expr {$h*3600+$m*60+$s}]
		# convert other stuff
		puts "$newdate;$f3;$f4;$telnumber;$f6;$f7;$duration_sec;$f9"
	}
	#close $infile
}

if {$argc == 0} {
	load_data
} else {
	puts stderr "Usage: $argv0 < infile > outfile"
	exit 1
}

Понятно, что это не готовый код, но прикрутить обработку нескольких файлов и конвертацию остальной фигни — элементарно.

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