Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Parcours de fichier (avec blancs) et ajout de caracteres

15 réponses
Avatar
ozzii
Bonjour,

J'ai ceci sur sun (solaris):

#! /usr/bin/ksh
IFS=3D""
while read ligne
do
cc=3D`echo "$ligne"|cut -c120-120`
case $cc in
1) nli=3D"1"$ligne;;
*) nli=3D" "$ligne;;
esac
echo "${nli}"
done <$1
exit

Ce que je voudrais, c'est ajouter le chiffre 1 en d=E9but de ligne quand
je trouve 1 en position 120 et sinon rajouter un blanc. Tout ceci est
OK, mais cela prend un temps fou. Pour un fichier mis=E9reux de 3M, il
me met + de 10min.

Sinon, la moiti=E9 de mon probl=E8me c'est de faire un sed pour rajouter
un blanc en d=E9but de chaque ligne (et cela prend 1 sec). Mais il faut
quand m=EAme que je reparcours mon fichier pour faire la recherche du 1
en position 120.

Est-ce que quelqu'un =E0 une solution pour acc=E9l=E9rer le processus ?

Merci par avance

10 réponses

1 2
Avatar
Stephane Chazelas
2007-01-12, 01:37(-08), ozzii:
Bonjour,

J'ai ceci sur sun (solaris):

#! /usr/bin/ksh
IFS=""
while read ligne
do
cc=`echo "$ligne"|cut -c120-120`
case $cc in
1) nli="1"$ligne;;
*) nli=" "$ligne;;
esac
echo "${nli}"
done <$1
exit


berk!

Eviter les boucles "while read" en shell!

Ce que je voudrais, c'est ajouter le chiffre 1 en début de ligne quand
je trouve 1 en position 120 et sinon rajouter un blanc. Tout ceci est
OK, mais cela prend un temps fou. Pour un fichier miséreux de 3M, il
me met + de 10min.


#! /usr/xpg4/bin/awk -f
{
if (substr($0, 120, 1) == "1")
print "1" $0
else
print " " $0
}



Sinon, la moitié de mon problème c'est de faire un sed pour rajouter
un blanc en début de chaque ligne (et cela prend 1 sec). Mais il faut
quand même que je reparcours mon fichier pour faire la recherche du 1
en position 120.
[...]


command -p sed '
/^.{119}1/{
s/^/1/
b
}
s/^/ /'


--
Stéphane

Avatar
Stephane Chazelas
2007-01-12, 09:43(+00), Stephane Chazelas:
[...]
command -p sed '
/^.{119}1/{
s/^/1/
b
}
s/^/ /'


Ou encore:

command -p sed 's/^/ /;/^.{119}1/s/./1/'

command -p, c'est pour invoquer la version standard de la
commande sed, que Solaris s'obstine a mettre ailleurs que dans
/bin ou /usr/bin.


--
Stéphane

Avatar
ozzii
Merci, je vais tester cela de suite.

On Jan 12, 10:46 am, Stephane Chazelas
wrote:
2007-01-12, 09:43(+00), Stephane Chazelas:
[...]

command -p sed '
/^.{119}1/{
s/^/1/
b
}
s/^/ /'Ou encore:


command -p sed 's/^/ /;/^.{119}1/s/./1/'

command -p, c'est pour invoquer la version standard de la
commande sed, que Solaris s'obstine a mettre ailleurs que dans
/bin ou /usr/bin.

--
Stéphane



Avatar
ozzii
OK, c'est bon avec le awk.
Petite question pour mon info personnel.
Y a t'il un autre moyen de faire un elif avec awk que :

awk '
{
if (substr($0, 120, 1) == "1" ||
substr($0, 120, 1) == "2" ||
substr($0, 120, 1) == "3" ||
substr($0, 120, 1) == "4" ||
substr($0, 120, 1) == "5" )
print "1" $0
else
print " " $0
}' <$1

Merci encore
Avatar
Stephane Chazelas
2007-01-12, 03:17(-08), ozzii:
OK, c'est bon avec le awk.
Petite question pour mon info personnel.
Y a t'il un autre moyen de faire un elif avec awk que :

awk '
{
if (substr($0, 120, 1) == "1" ||
substr($0, 120, 1) == "2" ||
substr($0, 120, 1) == "3" ||
substr($0, 120, 1) == "4" ||
substr($0, 120, 1) == "5" )
print "1" $0
else
print " " $0
}' <$1



if (substr($0, 120, 1) ~ /[1-5]/)

ou

i = substr($0, 120, 1)
if (i >= 1 && i <= 5)

ou

BEGIN {
a[1] a[2] a[3] a[4] a[5]
}

if (substr($0, 120, 1) in a)


--
Stéphane

Avatar
ozzii
Merci encore Stephane.
J'en ai appris des choses aujourd'hui.
Avatar
Christophe Leitienne
Stephane Chazelas wrote:


Eviter les boucles "while read" en shell!



Peut-on savoir pourquoi ?

Christophe.

Avatar
lhabert
Christophe Leitienne :

Eviter les boucles "while read" en shell!



Peut-on savoir pourquoi ?


L'instruction read lit octet par octet sur stdin, résultat, ça
rrrrrrrrrraaaaaaaaaaaaaaaaaaaaaaaaammmmmmmmmmmmmmmmmeeeeeeee, comme le PO
l'a constaté.


Avatar
Nicolas George
Luc Habert wrote in message <eo81pj$hgn$:
L'instruction read lit octet par octet sur stdin, résultat, ça
rrrrrrrrrraaaaaaaaaaaaaaaaaaaaaaaaammmmmmmmmmmmmmmmmeeeeeeee, comme le PO
l'a constaté.


En l'occurrence, je pense que la lenteur est plus probablement liée au
fork+exec d'un cut par ligne.

Avatar
Jacques L'helgoualc'h
Le 12-01-2007, Stephane Chazelas a écrit :
2007-01-12, 09:43(+00), Stephane Chazelas:
[...]

Ou encore:

command -p sed 's/^/ /;/^.{119}1/s/./1/'


Le 1 a bougé,

command -p sed 's/^/ /;/^.{120}1/s/./1/'

--
Jacques L'helgoualc'h

1 2