PDA

View Full Version : [x esperti && urgente] script avanzato parsing testo


sgdfgsgfsgs
24-01-2007, 20:55
salve gente!

non mi sto a dilungare spiegando la vicenda e le urgenze, arrivo subito al dunque:

ho un file di testo con n righe cosi formattato:


........
mysql -u root -pgood -D robin_www --exec "update dartagnan set user_id ='9009' where username =pippo'"
mysql -u root -pgood -D robin_www --exec "update dartagnan set user_id ='9010' where username ='pluto'"
mysql -u root -pgood -D robin_www --exec "update dartagnan set user_id ='9011' where username ='paperino"
mysql -u root -pgood -D robin_www --exec "update dartagnan set user_id ='blablabla' where username ='minni'"
mysql -u root -pgood -D robin_www --exec "update dartagnan set user_id ='bliblibli' where username ='topolino'"
.......


come potete notare, questo file č composto da n record, omogenei, dove l' unica cosa che cambia č il numero id (numerico e crescente) e l'username.

il problema nasce dal fatto che ad un certo punto gli id non sono + campi numerici e crescenti, benzi parole alla rinfusa!

io vorrei uno script che mi sostituisca, quando il campo degli id fa a farsi fottere (precisamente dopo il 9011), con il numero seguente!

nel nostro esempio qindi blablabla diventera' 9012, bliblibli diventera 9013 e cosi via!

contanto che i record sono centinaia e centinaia, farlo a mano sarebbe da suidio!

chi mi salva la vita, il lavoro e il tunnel carpale? :stordita:

megamitch
24-01-2007, 21:58
Ciao, se ho capito bene le tue esigenze...

é uno script banalissimo (non sono cosė skillato sul bash sripting) ma dovrebbe rispondere alle tue esigenze.

Allora, diciamo che file1 č l'originale, file2 un file di appoggio e file3 l'output.

Io farei ad esempio cosė

count=9009

cat file1 | awk '{gsub(/ /,";"); print}' > file2

for item in `cat file2` ; do echo $item | awk -F "=" '{print "mysql -u root -pgood -D robin_www --exec \"update dartagnan set user_id ='\''"'$count'"'\'' where username ="$3}' ; let "count=$count+1"; done > file3

Note: count lo inizializzi con il primo numero che devi usare. Il file di appoggio mi serve per cambiare in carattere " " in ";" che riesco a maneggiare meglio con echo.

Ci saranno sicuramente soluzioni pių eleganti....come dicevo, sono alle prime armi

Ciao, spero di esserti stato di aiuto

kingv
24-01-2007, 22:02
mioscript.pl nomefile >filemodificato

#!/usr/bin/perl

$n = 1;

while (<>)
{
$line = $_;
$line =~ /user_id ='(\w*)'/;
$user_id = $1;
if ($user_id =~ /\d+/)
{
$n = $user_id;
}
else
{
$line =~ s/user_id ='[a-zA-Z]+'/user_id ='$n'/;
}
print $line;
$n++;
}

di sicuro si puo' fare di meglio ma mi sembra funzioni.

megamitch
24-01-2007, 22:05
Lo ammetto, devo studiare le regexp.... :D :D :D

sgdfgsgfsgs
24-01-2007, 23:34
grazie a tutti!

problema risolto! :*