Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Aller à la page:  1 2 Page suivante
Page: 1 sur 2
Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: JordiX

Salut,

Voilà je manipule un fichier de 10 Mo en shell script.
J'utilise les fonctions grep, awk et sed pour chercher, supprimer et modifier des lignes. Et ceci en boucle.
Mon problème c'est que je passe toujours par le fichier, c'est à dire que le grep s'effectue sur un fichier, que j'écrase ensuite avec le resultat du sed etc etc...
Exemple: cat fichier | grep "blabla" | sed 'etc etc' > fichier2
et ainsi de suite..

Or comme le fichier fait 10Mo, et que le disque dur est très sollicité (pour traiter 1 igne du fichier il doit recopier le fichier entier), l'exécution est hyper lente! :,(

En C++ par exemple, on peut charger un fichier en mémoire afin d'y faire des opérations beaucoup plus vite, car le disque dur n'est pas sollicité.
Y a t-il un moyen de le faire en shell?
Si je fais variable=`cat fihier` la variable contient bien le fichier, mais je perd alors les retours à la ligne. De plus je ne sais pas si je peu mettre tout un fichier de 10Mo ou plus dans une variable pour travailler dessus.

Le problème c'est qu'en C, on ouvre un fichier, on modifie la ligne et on referme le fichier. En shell, si j'utilise sed (je ne connais rien d'autre), la commande ne modifie pas le fichier, elle renvoie le fichier modifié qu'il faut ensuite réécrire, donc accès au disque beaucoup plus long..


Quelqu'un aurait-il une solution? ?-(
Merci d'avance! :-)

Poste le Monday 25 July 2005 14:45:31
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite

et si donnais plus de details sur le fichier en question et ton script ?
Sinon regarde du cote des ramdisk

--
Brugmans Frédéric

[www.brugmans.net]
[triathlon.sport-challenge.be]

Poste le Monday 25 July 2005 14:53:25
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: mute

je ne comprend pas très bien ce que tu veux obtenir et je ne comprend pas trop ton problème

Citation

cat fichier | grep "blabla" | sed 'etc etc' > fichier2

sauf erreur de ma part les seul accès disques que tu fais c'est lors du cat et à la fin pour la redirection...

sinon regarde du coté de perl
c'est plutôt bien adapté à la manipulation de fichier
[lea-linux.org]
si tu sais te servir de sed tu ne devrais pas avoir trop de problèmes.

donne plus de precision sur ce que tu veux faire (plutôt que sur la façon dont tu veux le faire) on te proposera alors des solutions et tu pourra choisir celle que tu préfères...


Poste le Monday 25 July 2005 14:58:07
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: JordiX

Mon fichier est sous cette forme:


20050405200311;Origine;Destination;flag;flag2;Texte
20050405200611;Origine;Destination;flag;flag2;Texte2
20050405200911;Origine;Destination;flag;flag2;Texte3
etc..
Il a une longuer de 44000 lignes a peu près, il pèse 10Mo.


Pour chaque ligne j'en extrait chaque champ, et je fais un grep de la ligne sur le fichier pour compter si la ligne apparait en double.
Si elle apparait en double je compte les doubles, et je les supprime avec:
cat fichier | grep -v $ligne > fichier2
cat fichier2 > fichier

En plus certaines de ces lignes je les modifie avec sed, genre:
cat fichier | sed 's:blabla:remplacement:g' > fichier2
cat fichier2 > fichier

Et ceci pour chaque ligne.
Ce qui veut dire que pour chaque ligne je fais 2 ou 3 copies du fichier de 10Mo, car à chaque ">" il accède au disque.

Alors ma question est assez simple, au lieu de faire des greps sur des fichiers et de rediriger le resultat des commandes vers le même fichier, ne puis-je pas travailler avec le fichier chargé en RAM et une fois toutes les lignes traitées enregistrer le fichier sur disque?
Car à chaque accès au disque, il me recopie un fichier de 10Mo, ce qui est très lent. Si je travaillait avec de la RAM ça serait plus rapide.

J'ai regardé pour ramdisk, mais il faut utiliser des partitions virtuelles si j'ai bien compris, un peu compliqué. N'y a t'il pas une façon plus simple?
Charger le fichier dans une variable (donc mémoire vive) m'enlève les retours a la ligne, or mon fichier je le traite ligne par ligne avec un
While read ligne
do
....
done

Merci! :-)

N.B: je ne poste pas mon script car le fichier contient près de 300 lignes.

Poste le Monday 25 July 2005 15:09:17
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: mute

est ce que l'ordre des lignes à une importance ?

sinon
cat fichier | sort | uniq | sed 'regexp' > fichier2
mv -f fichier2 fichier <-- ca tu peux déja le mettre en pratique

Poste le Monday 25 July 2005 15:16:16
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: mute

Citation
JordiX
N.B: je ne poste pas mon script car le fichier
contient près de 300 lignes.

300 lignes ????

il fait le café aussi ? parce que si c'est juste pour faire ce que tu nous décris au dessus ça me parait beaucoup trop

Poste le Monday 25 July 2005 15:18:42
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: JordiX

Citation
mute
est ce que l'ordre des lignes à une importance ?
mv -f fichier2 fichier <-- ca tu peux déja le
mettre en pratique

C'est vrai, ceci me fera gagner du temps au niveau de l'accès disque. merci.

L'ordre des lignes n'a pas d'importance.
En fait lorsque la ligne est en double, je dois les compter, et ensuite les virer. Puis ouvrir un fichier et incrémenter un compteur.
Je sais que mes exemples n'ont que très peut d'accès au disque, mais pensez que je fais l'opération 2 a 3 fois par ligne, donc comme il y a a peu près 44000 lignes, j'écris 44000 x 10Mo sur le disque a peu près..
Quand c'est dans une boucle c'est très lent.

Y a t'il un moyen de faire ceci de faire l'équivalent de "> fichier" mais en passant par la ram au lieu d'appeller le disque dur?

Poste le Monday 25 July 2005 15:22:39
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: JordiX

300 lignes car bien indenté.
Pour chaque ligne je dois faire une série de tests avant de faire une action dessus. Je dois regarder l'origine, et en fonction incrementer un compteur ou un autre. De même pour la destination.
Je dois ensuite calculer le délai entre les messages qui sont en double etc..

J'ai aussi beaucoup de boucles imbriquées etc.. le nombre de lignes ets plustot normal je pense ;-)

Poste le Monday 25 July 2005 15:25:39
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: Teotihuacan

Salut,

J'ai fait jusqu'à maintenant assez peu de scripts mais :

_ C'est vrai que le ramdisk, c'est une solution

_ On ne peux pas mettre le contenu du fichier dans une variable ? un truc du style var=`cat fichier`, puis utiliser echo $var pour rappeler le contenu ? non ?

A+

___Teotihuacan____________________________________
John Lennon se prennait pour Dieu... Moi je me prends pour John Lennon

Poste le Monday 25 July 2005 15:26:01
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: Teotihuacan

Salut,

J'ai fait jusqu'à maintenant assez peu de scripts mais :

_ C'est vrai que le ramdisk, c'est une solution

_ On ne peux pas mettre le contenu du fichier dans une variable ? un truc du style var=`cat fichier`, puis utiliser echo $var pour rappeler le contenu ? non ?

A+

___Teotihuacan____________________________________
John Lennon se prennait pour Dieu... Moi je me prends pour John Lennon

Poste le Monday 25 July 2005 15:26:01
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: Teotihuacan

Désolé pour le double post, mais j'ai rippé sur mon touchpad smiling smiley

___Teotihuacan____________________________________
John Lennon se prennait pour Dieu... Moi je me prends pour John Lennon

Poste le Monday 25 July 2005 15:26:58
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: mute

je ne comprend pas pourquoi tu as besoin de faire l'opération 2 à 3 fois par ligne ?

pourrai tu décrires exactement ce que doit faire ton script

a mon avis un petit script perl irai vraiment très vite

cat fichire | sort | uniq -c te permet de compter les doublons

Poste le Monday 25 July 2005 15:31:40
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: JordiX

J'ai essayé ce que tu dis, mais le fait de mettre un fichier dans une variable (ce qui serait parfait) supprime les retours à la ligne.
Du coup mes 44000 lignes se retrouveront dans une seule ligne dans ma variable.
D'ailleur je ne sais pas la taille limite d'une variable, mais ça m'étonnerait qu'une variable puisse accepter 10Mo de caractères, non?

Je vais regarder un peu plus en détail la solution du ramdisk mais je pensait qu'un truc plus simple était faisable..

Merci :-)
Quelqu'un a une autre idée?

Poste le Monday 25 July 2005 15:32:04
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite

Sans l'avoir vu, je dirais que ton script doit etre du genre très très bourrin.

Regarde du coté de sort et d'uniq ( l'option -d ) et surtout awk ( avec gsub ) .

cela donnerais quelques chose comme ceci :

sort fichier |uniq | sed -e 's|foo|bar|g' -e 's|foo1|bar1|g' ... etc




--
Brugmans Frédéric

[www.brugmans.net]
[triathlon.sport-challenge.be]

Poste le Monday 25 July 2005 15:39:09
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: JordiX

Ok, je donne plein de détails:

J'ai un log avec plein d'SMS envoyés.
Le format est:

date;origine;destination;flag;flag;message

J'en extrait tous les champs.

Pour compter les doublons (SMS envoyés en double sans vouloir), je ne peut pas me baser sur la ligne en entier, je dois regarder les numeros et le texte, pas la date car les sms doublés ne s'envoient pas simultanément.

Pour chaque sms donc, j'en extrait l'origine et je regarde a quel opérateur il appartient. En fonction de ceci j'incrémente un compteur dans un autre fichier appellé TOTALSMS.

Ainsi pour chaque ligne j'incrémente un compteur 1 fois, apres pour chaque doublon j'en incrémente un autre.
Ensuite je vire les sms deja traités.

Donc a force de faire des greps pour voir les doublons, plus faire des sed pour modifier le fichier qui contient les compteurs, puis pour virer les sms traités, chaque opération requier 1 accès disque.
Ceci est extrèmement long.
Je gagnerai du temps si les traitements étaient effectués sur la mémoire directement, au lieu d'ecrire sur le disque a chaque fois..

Voilà voilà, d'autres précisions?

Pour virer les sms doubles, j'utilise
cat fichier | grep -v "origine,destination,message" > fichier

Pur incrémenter le compteur j'utilise
cat TOTALSMS | sed 's:\([0-9]\),\([0-9]\),\([0-9]\):$var,var2,var3' > TOTALSMS

var1 2 3 contienent des compteurs extraits de TOTALSMS que j'ai esuite incrémenté après avoir compté les messages. Je reinjecte donc ces valeurs.

Ceci pour chaque ligne est très long.
Non seulement je dois compter les SMS doublés, mais aussi les traiter en regardant l'intervalle de temps entre chacun.

Poste le Monday 25 July 2005 15:42:33
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: mute

c'est marrant c'est la solution que je lui propose depuis tout à l'heure...

j'aimerai bien voir la tête du script, à mon avis une vingtaine de lignes perl peuvent faire le boulot en une passe...

enfin je dis ça je ne sais toujours pas exactement ce que doit faire le script

Poste le Monday 25 July 2005 15:43:19
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: JordiX

Citation
Brugmans Frédéric
Sans l'avoir vu, je dirais que ton script doit
etre du genre très très bourrin.

Regarde du coté de sort et d'uniq ( l'option -d )
et surtout awk ( avec gsub ) .

cela donnerais quelques chose comme ceci :

sort fichier |uniq | sed -e 's|foo|bar|g' -e
's|foo1|bar1|g' ... etc
:


ça en a l'air, mais il faut faire bcp de tests et ceci ne tient pas sur une ligne uniquement.

Poste le Monday 25 July 2005 15:44:21
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite

mettre le fichier en variable ? no problemo

IFS=$'\n' ; boucle=0 ; for i in $( cat FICHIER ) ; do var[$boucle]="$i" ; let boucle=boucle+1 ; done

ensuite tu récupère numeriquement

echo ${i[1]} ${i[1]} ${i[5]} ${i[2]} ${i[3]}

ou l'ensemble

echo ${i[@]}

ou le nombre d'élement

echo ${#i[@]}

--
Brugmans Frédéric

[www.brugmans.net]
[triathlon.sport-challenge.be]

Poste le Monday 25 July 2005 15:46:31
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: JordiX

Voici le script:
Je ne suis pas un pro, je sais que ce n'est pas super optimisé, d'accord.
Je fais ce que je peu. :-/
Voir si ça vous éclairci:
----------------------------------------------------------------

#! /bin/bash

RESUM='Resum_SMS.csv'

#Llista de les variables
set data
set any
set mes
set dia
set hora
set minuts
set segons
set type
set global_title
set origin
set destination
set missatge


numlinies=`wc -l < SMS_tractats | sed 's:[^0-9]*\([0-9]*\):\1:g'`
while [ $numlinies -gt 0 ]
do
# echo "*** LINIES: $numlinies***"
linea=`head -1 SMS_tractats | tail -1`
#echo $linea | grep "[0-9]\{14\},\?,\?,"
#ok=$? #ok<- resultat del comando grep

#if [ $ok == 0 ]; then #SI la linea conte un nou missatge

#J'extrat les differents champs du sms
any=`echo $linea | sed 's:\(^[0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\).*$:\1:g'`
mes=`echo $linea | sed 's:\(^[0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\).*$:\2:g'`
dia=`echo $linea | sed 's:\(^[0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\).*$:\3:g'`
hora=`echo $linea | sed 's:\(^[0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\).*$:\4:g'`
minuts=`echo $linea | sed 's:\(^[0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\).*$:\5:g'`
segons=`echo $linea | sed 's:\(^[0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\).*$:\6:g'`
type=`echo $linea | sed 's:^[0-9]\{14\},\([0-9]\{1\}\),\([0-9]\{1\}\),\([0-9]*\),\([0-9]*\),\([0-9]*\),.*$:\1:g'`
global=`echo $linea | sed 's:^[0-9]\{14\},\([0-9]\{1\}\),\([0-9]\{1\}\),\([0-9]*\),\([0-9]*\),\([0-9]*\),.*$:\3:g'`
origin=`echo $linea | sed 's:^[0-9]\{14\},\([0-9]\{1\}\),\([0-9]\{1\}\),\([0-9]*\),\([0-9]*\),\([0-9]*\),.*$:\4:g'`
destination=`echo $linea | sed 's:^[0-9]\{14\},\([0-9]\{1\}\),\([0-9]\{1\}\),\([0-9]*\),\([0-9]*\),\([0-9]*\),.*$:\5:g'`
udhi=`echo $linea | awk -F\, '{print $7}'`
dcs=`echo $linea | awk -F\, '{print $8}'`
missatge=`echo $linea | sed 's:^[0-9]\{14\},\([0-9]\{1\}\),\([0-9]\{1\}\),\([0-9]*\),\([0-9]*\),\([0-9]*\),\(.*$\):\4,\5,\6:g'`


#Tracto el SMS

#Mirar que TYPE=0, UDHI=0 i DCS=0
if [ $type -eq 0 -a $udhi -eq 0 -a $dcs -eq 0 ];then

echo $global | grep "37630.*"
if [ $? -eq 0 ]; then
#----------------- Andorra -> Estranger--

#BJe cherche les 5 premiers car de l' IMSI
grep ";`echo $destination | sed 's:\(^[0-9]\{5\}\).*$:\1:g'`" $RESUM
if [ $? -eq 0 ]; then

#Guardo el IMSI
IMSIOP=`echo "$destination" | sed 's:\(^[0-9]\{5\}\).*$:\1:g'`
# echo "IMSI: $IMSIOP"

grep ";$IMSIOP"< $RESUM
if [ $? -eq 0 ]; then #Si s'ha trobat l'IMSI continua

#Extreu el contador TOTAL_OUT i el inrecmenta
TO=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $5}'`
TO=`expr $TO + 1`

#Extreu els OUT i els incrementa
O10=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $15}'`
O20=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $16}'`
O30=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $17}'`
O40=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $18}'`
O50=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $19}'`
O1=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $20}'`
O2=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $21}'`
O3=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $22}'`

O10=`expr $O10 + 1`
O20=`expr $O20 + 1`
O30=`expr $O30 + 1`
O40=`expr $O40 + 1`
O50=`expr $O50 + 1`
O1=`expr $O1 + 1`
O2=`expr $O2 + 1`
O3=`expr $O3 + 1`


#Extreu els IN per reinjectarlos talqual
TI=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $4}'`
I10=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $7}'`
I20=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $8}'`
I30=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $9}'`
I40=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $10}'`
I50=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $11}'`
I1=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $12}'`
I2=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $13}'`
I3=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $14}'`

#Extreu el Total_Double
TD=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $6}'`


#Remplaco el TOTAL_OUT i els OUT i reinjecto els IN talqual
cat $RESUM | sed 's:\(^[^;]*\);\('$IMSIOP'\);\([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]*\);\([0-9]*\);\([0-9]*\);\([0-9]*\);\([0-9]*\);\([0-9]*\);\([0-9]*\);:\1;\2;\3;'$TI';'$TO';'$TD';'$I10';'$I20';'$I30';'$I40';'$I50';'$I1';'$I2';'$I3';'$O10';'$O20';'$O30';'$O40';'$O50';'$O1';'$O2';'$O3';:g' > temp

test -f temp
if [ $? -ne 1 ]; then
cat temp > $RESUM
# echo "*** Remplacament efectuat ***"

fi

#-------------------Je regarde si ils sont en double

n=`grep "$missatge" SMS_tractats | wc -l | sed 's:[^0-9]*\([0-9]*\):\1:g'`
# echo "*** REPETIT: $n cops ***"
if [ $n -gt 1 ]; then
# echo "*** Missatge repetit ***"
grep "$missatge" "SMS_tractats" | while read line
do
hora2=`echo $line | sed 's:\(^[0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\).*$:\4:g'`
minuts2=`echo $line | sed 's:\(^[0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\).*$:\5:g'`
segons2=`echo $line | sed 's:\(^[0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\).*$:\6:g'`


if [ `expr $hora2 \* 60 + $minuts2 + $segons` -ne `expr $hora \* 60 + $minuts + $segons2` ];then
#Tracta els sms repetits
# echo "*** Tracto el repetit ***"
if [ $hora2 -lt $hora ];then
INTERVAL=`expr \( 24 - $hora \) \* 60 + $hora2 \* 60 + $minuts2 - 60 + $minuts`
else
INTERVAL=`expr $hora2 \* 60 + $minuts2 - $hora \* 60 - $minuts`
#Si interval continua sent < 0 es que son els segons
if [ $INTERVAL -lt 0 ];then
INTERVAL=1
fi
fi
# echo "Interval: $INTERVAL"

#----------Modif en fonction de l'intervale-------
#----------------------------------------------------

O10=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $15}'`
O20=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $16}'`
O30=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $17}'`
O40=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $18}'`
O50=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $19}'`
O1=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $20}'`
O2=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $21}'`
O3=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $22}'`



#Incremento el O10
O10=`expr $O10 + 1`
if [ $INTERVAL -gt 10 ];then
#Incremento el O20
O20=`expr $O20 + 1`
if [ $INTERVAL -gt 20 ];then
#Incremento el O30
O30=`expr $O30 + 1`
if [ $INTERVAL -gt 30 ];then
#Incremento el O40
O40=`expr $O40 + 1`
if [ $INTERVAL -gt 40 ];then
#Incremento el O50
O50=`expr $O50 + 1`
if [ $INTERVAL -gt 50 ];then
#Incremento el O1H
O1=`expr $O1 + 1`
if [ $INTERVAL -gt 60 ];then
#Incremento el O2H
O2=`expr $O2 + 1`
if [ $INTERVAL -gt 120 ];then
#Incremento el O3H
O3=`expr $O3 + 1`
fi
fi
fi
fi
fi
fi
fi

#Extreu el Total_Double i l'incrementa
TD=`cat $RESUM | grep ";$IMSIOP" | awk -F\; '{print $6}'`
TD=`expr $TD + 1`

#Extreu el contador TOTAL_OUT i el inrecmenta
TO=`expr $TO + 1`

#Remplaco els OUT Doblats i reinjecto els IN talqual
cat $RESUM | sed 's:\(^[^;]*\);\('$IMSIOP'\);\([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]*\);\([0-9]*\);\([0-9]*\);\([0-9]*\);\([0-9]*\);\([0-9]*\);\([0-9]*\);:\1;\2;\3;'$TI';'$TO';'$TD';'$I10';'$I20';'$I30';'$I40';'$I50';'$I1';'$I2';'$I3';'$O10';'$O20';'$O30';'$O40';'$O50';'$O1';'$O2';'$O3';:g' > $RESUM

test -f test
if [ $? -ne 1 ];then
temp > $RESUM
# echo "*** Doblat Contat ***"
fi
fi

done
fi #Fi repetit
fi #Fi test del imsi
fi #Fi destinacio
else

#------------------- Estranger -> Andorra -------------------
#------------------------------------------------------------
echo "***VPas encore traité***"

#Guardo el preffix del operador

fi #Fi estranger
fi #Fi UHDI

# fi #Fi linea nou missatge

#echo "*** Aqui borro els missatge tractat ***"
grep -v "$missatge" SMS_tractats > SMS_temp
cat SMS_temp > SMS_tractats
numlinies=`wc -l < SMS_tractats | sed 's:[^0-9]*\([0-9]*\):\1:g'`

done

Poste le Monday 25 July 2005 15:49:06
Répondre     Citer    
Re: Shell - Charger fichier en mémoire pour le traiter + vite
Envoyé par: mute

bon voila un petit script perl vite fait

tu peux te baser dessus si ca te dis

Citation

#!/usr/bin/perl -W
$nblignes = 0;
$nbdoublons = 0;

while (<STDIN>) {
$nblignes = $nblignes + 1;
if(/(\d)(.*);(.*);(.*);(.*);(.*);(.*)/)
{
if($1 > 1)
{
$nbdoublons = $nbdoublons + 1;
}
print "date ".$2."\n";
print "origne ".$3."\n";
print "destination ".$4."\n";
print "flag1 ".$5."\n";
print "flag2 ".$6."\n";
print "data ".$7."\n";
}
}

print "nb lignes ".$nblignes."\n";
print "nb doublons".$nbdoublons."\n";
désolé pour l'indentation j'y arrive pas ici...


il s'utilise comme ça:
cat fichier | sort | uniq -c | ./script.perl

Poste le Monday 25 July 2005 16:22:31
Répondre     Citer    
Aller à la page:  1 2 Page suivante
Page: 1 sur 2

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Shell - Charger fichier en mémoire pour le traiter + vite
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.
Nouveau sujet sur ce forum

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons