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

substitution de caractères consécutifs identiques

10 réponses
Avatar
chrirama
Dans un fichier de +/- 700000 records d=E9limit=E9s je dois filtrer les
champs 2 et 3 pour ne garder qu'une occurence de caract=E8res
cons=E9cutifs.
ex: ZOO doit devenir ZO de m=EAme que ZOOOOOOOOO
Tous les caract=E8res des deux cha=EEnes sont des majuscules de A =E0 Z.
La plateforme est un solaris 8 avec les outils standard plus perl et
nawk.

Quelqu'un a-t'il une id=E9e?
Merci.

10 réponses

Avatar
Élodie
sed 1,$s/a/b/g
change tous les caractères a en b de la première à la dernière ligne du
fichier, dans (g) tout le fichier.

regarde sur internet la commande sed pour plus de détails

"chrirama" a écrit dans le message de news:

Dans un fichier de +/- 700000 records délimités je dois filtrer les
champs 2 et 3 pour ne garder qu'une occurence de caractères
consécutifs.
ex: ZOO doit devenir ZO de même que ZOOOOOOOOO
Tous les caractères des deux chaînes sont des majuscules de A à Z.
La plateforme est un solaris 8 avec les outils standard plus perl et
nawk.

Quelqu'un a-t'il une idée?
Merci.
Avatar
Stephane Chazelas
2007-06-10, 12:36(-07), chrirama:
Dans un fichier de +/- 700000 records délimités je dois filtrer les
champs 2 et 3 pour ne garder qu'une occurence de caractères
consécutifs.
ex: ZOO doit devenir ZO de même que ZOOOOOOOOO
Tous les caractères des deux chaînes sont des majuscules de A à Z.
La plateforme est un solaris 8 avec les outils standard plus perl et
nawk.

Quelqu'un a-t'il une idée?


LC_ALL=C tr -s A-Z

Avec Solaris, il faut peut-etre

LC_ALL=C tr -s '[A-Z]'

--
Stéphane

Avatar
Olivier Miakinen
[ je remets les articles dans l'ordre et je rajoute les chevrons de
citation ]


Dans un fichier de +/- 700000 records délimités je dois filtrer les
champs 2 et 3 pour ne garder qu'une occurence de caractères
consécutifs.
ex: ZOO doit devenir ZO de même que ZOOOOOOOOO
Tous les caractères des deux chaînes sont des majuscules de A à Z.
La plateforme est un solaris 8 avec les outils standard plus perl et
nawk.



Le 10/06/2007 22:03, Élodie a répondu :

sed 1,$s/a/b/g
change tous les caractères a en b de la première à la dernière ligne du
fichier, dans (g) tout le fichier.


Je ne sais pas si on peut le faire avec sed, mais l'idéal serait
une expression rationnelle pouvant réutiliser une portion de chaîne
reconnue, non pas seulement dans la partie droite, mais aussi dans
la partie gauche, comme peut le faire perl.

Un truc du genre :
sed -e 's/([A-Z])1+/1/g'


P.-S. 1 : Merci de citer à l'endroit.
Voir <http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html>;.

P.-S. 2 : pour aider ton Outlook Express à citer correctement (en
particulier à conserver les chevrons même quand il répond à des articles
en quoted-printable), je te conseille l'indispensable OE Quotefix.
Voir <http://www.aminautes.org/forums/configurer/oe/QF_doc.html>;.


Avatar
Olivier Miakinen

LC_ALL=C tr -s A-Z

Avec Solaris, il faut peut-etre

LC_ALL=C tr -s '[A-Z]'


Ah oui, c'est bien la méthode la plus simple. Je n'avais pas lu ton
article avant de rédiger le mien.

D'ailleurs je ne connaissais aucune des options de la commande tr, pas
seulement l'option -s ou --squeeze-repeats, mais aussi les options -d
(--delete) et -t (--truncate-set1), ni surtout l'option -c, et je ne
comprends pas le 'man' concernant cette option. Quelqu'un saurait me
l'expliquer ?

<cit.>
NAME
tr - translate or delete characters

SYNOPSIS
tr [OPTION]... SET1 [SET2]

DESCRIPTION
Translate, squeeze, and/or delete characters from standard input,
writing to standard output.

-c, -C, --complement
first complement SET1

-d, --delete
delete characters in SET1, do not translate

-s, --squeeze-repeats
replace each input sequence of a repeated character
that is listed in SET1 with a single occurrence of that
character

-t, --truncate-set1
first truncate SET1 to length of SET2
</cit.>

Avatar
chrirama
On 10 juin, 22:07, Stephane Chazelas
wrote:
2007-06-10, 12:36(-07), chrirama:

Dans un fichier de +/- 700000 records délimités je dois filtrer les
champs 2 et 3 pour ne garder qu'une occurence de caractères
consécutifs.
ex: ZOO doit devenir ZO de même que ZOOOOOOOOO
Tous les caractères des deux chaînes sont des majuscules de A à Z.
La plateforme est un solaris 8 avec les outils standard plus perl et
nawk.

Quelqu'un a-t'il une idée?


LC_ALL=C tr -s A-Z

Avec Solaris, il faut peut-etre

LC_ALL=C tr -s '[A-Z]'

--
Stéphane


Merci 1000 fois.


Avatar
Thierry B
--{ Olivier Miakinen a plopé ceci: }--

D'ailleurs je ne connaissais aucune des options de la commande tr, pas
seulement l'option -s ou --squeeze-repeats, mais aussi les options -d
(--delete) et -t (--truncate-set1), ni surtout l'option -c, et je ne
comprends pas le 'man' concernant cette option. Quelqu'un saurait me
l'expliquer ?


Ah! vraiment très étrange en fait. Je ne connais pas l'option
-c et je viens de l'essayer. A première vue, délicate à utiliser.


#v+
:~$ tr -d 'cde'
abcdefgh
abfgh
:~$ tr -dc 'cde'
abdcefgh
:~$
#v-

Premier essai: on vire tout ce qui est 'c' ou 'd' ou 'e'.
Jusque là, rien de bien secret. Le tr -d 'r' pour nettoyer
un fichier messydos, c'est connu depuis le siècle dernier.

Par contre, le second est plus sioux: on ne garde que le
complément de 'cde', c'est à dire 'c' ou 'd' ou 'e'. Et là,
paf, dans la manip, on a perdu le eol :)

Les commandes Unix, même les plus simples, sont toujours
vraiment étonnantes. A moins que ce ne soit la sauce GNU
qui leur donne cette saveur étrange :)

--
Some of the names IBM uses are REENTRANT, REFRESHABLE,
and SERIALLY REUSABLE. It isn't obvious to me that PURE can't
be only SERIALLY REUSABLE, unless PURE implies RECURSIVE.

Avatar
Olivier Miakinen

Ah! vraiment très étrange en fait. Je ne connais pas l'option
-c et je viens de l'essayer. A première vue, délicate à utiliser.

#v+
:~$ tr -d 'cde'
abcdefgh
abfgh
:~$ tr -dc 'cde'
abdcefgh
:~$
#v-


J'ai essayé dans Cygwin. C'est encore plus rigolo quand on saisit
plusieurs lignes, puisqu'alors il y a un « flush » à chaque ligne quand
on garde les sauts de ligne, mais pas dans le cas contraire.

$ tr -d aeiou
Ceci est
Cc st
un essai
n ss
$ tr -c -d aeiou
Ceci est
un essai
eieueai$

Les commandes Unix, même les plus simples, sont toujours
vraiment étonnantes.


Oui. ;-)

A moins que ce ne soit la sauce GNU
qui leur donne cette saveur étrange :)


J'essaierai demain sur AIX, pour voir.

Avatar
Olivier Miakinen
Le 11/06/2007 23:50, j'écrivais :

J'ai essayé dans Cygwin. C'est encore plus rigolo quand on saisit
plusieurs lignes, puisqu'alors il y a un « flush » à chaque ligne quand
on garde les sauts de ligne, mais pas dans le cas contraire.

$ tr -d aeiou
Ceci est
Cc st
un essai
n ss
$ tr -c -d aeiou
Ceci est
un essai
eieueai$

A moins que ce ne soit la sauce GNU
qui leur donne cette saveur étrange :)


J'essaierai demain sur AIX, pour voir.


J'ai essayé sur Linux, AIX et Solaris. Pour Linux c'est comme Cygwin ;
mais pour AIX et Solaris il y a un affichage à chaque ligne, donc :
$ tr -c -d aeiou
Ceci est
eieun essai
ueai$


Avatar
thulhu
L'option -c c'est le complement de la liste (ou la négation si vous
préférez).
En d'autre terme ça se traduit par tous les caractères SAUF ceux qui
sont dans la liste.
Et tous les caracteres c'est TOUT le code ASCII y compris les
caractères speciaux (retour à la ligne et compagnie).

exemple :

# tr -c ' n' '[X*]'
salut les bleus
XXXXX XXX XXXXX
^D
#

première liste : espace et retour à la ligne
Donc tr -c ' n' '[X*]' c'est remplacer tous les caractères SAUF les
espaces et les retours à la ligne par un X.

(en tous cas sur AIX (ksh86), HP/UX (ksh86),Solaris (ksh86 et zsh3.0),
linux (bash2.05b))

F.
Avatar
Olivier Miakinen
L'option -c c'est le complement de la liste (ou la négation si vous
préférez).
En d'autre terme ça se traduit par tous les caractères SAUF ceux qui
sont dans la liste.
Et tous les caracteres c'est TOUT le code ASCII y compris les
caractères speciaux (retour à la ligne et compagnie).


Merci de confirmer l'explication de Thierry.

Attention cependant, les caractères pris en compte vont plus loin que le
code ASCII (essai en iso-8859-1) :

$ tr 'a-z' X
Ça va bien, déjà, Élodie ?
ÇX XX XXXX, XéXà, ÉXXXXX ?
$ tr -c 'a-z n' X
Ça va bien, déjà, Élodie ?
Xa va bienX dXjXX Xlodie X
$

exemple :

# tr -c ' n' '[X*]'
salut les bleus
XXXXX XXX XXXXX
^D
#


Comme je l'ai fait ci-dessus, tant que l'on n'utilise pas l'option -t
(truncate SET2), on peut bien écrire « X » à la place de « '[X*]' »
puisque le X sera répété autant de fois qu'il y a de caractères dans SET1.