Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/10/2020, à 19:32

Mehdouch

Couper une chaîne de caractère dans un fichier

Bonjour la communauté.
J'ai un fichier texte qui contient des chiffres séparés à certains endroits avec des espaces:
122862324313212465131261345231523415352163453136431326431045452542451214564225564321361650545210208814722066034489802044511230157626158697538374264328643428667972353241634912464340045467246640416437352023.
Ce que je veux c'est avoir le 1er caractère le 6ème le 11ème le 16ème ... jusqu'à la fin.
Je peux le faire avec cut -c1,6,11,16........... jusqu'à la fin. Mais si le fichier est long ça risque d'être pénible.
Avez vous des idées svp ?
Merci d'avance.

Hors ligne

#2 Le 16/10/2020, à 20:01

Watael

Re : Couper une chaîne de caractère dans un fichier

salut,

sed est plus indiqué, ici.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 16/10/2020, à 21:09

grigouille

Re : Couper une chaîne de caractère dans un fichier

hormis le retour à la ligne je ne vois pas d'espace.


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#4 Le 17/10/2020, à 09:09

pingouinux

Re : Couper une chaîne de caractère dans un fichier

Bonjour,
Avec la ligne que tu as donnée, voici 3 méthodes : sed, awk, python3

s="122862324313212465131261345231523415352163453136431326431045452542451214564225564321361650545210208814722066034489802044511230157626158697538374264328643428667972353241634912464340045467246640416437352023"

sed -r 's/(.)(.{4}|.{0,3}$)/\1/g' <<<"$s"

awk '{for(i=1;i<=length($0);i+=5)printf("%s",substr($0,i,1));print""}' <<<"$s"

python3 -c 'import sys;print(sys.argv[1][::5])' "$s"

qui donnent toutes ce résultat

12141455611342124650104050268668724607442

Hors ligne

#5 Le 17/10/2020, à 09:19

Watael

Re : Couper une chaîne de caractère dans un fichier

pourquoi |.{0,3}$ ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 17/10/2020, à 09:41

pingouinux

Re : Couper une chaîne de caractère dans un fichier

Watael a écrit :

pourquoi |.{0,3}$ ?

Parce que sinon, si le nombre de caractères n'est pas multiple de 5, il y a des caractères en trop.

$ sed -r 's/(.).{4}/\1/g' <<<"12345678"
1678

Ajouté :

$ sed -r 's/(.)(.{4}|.{0,3}$)/\1/g' <<<"12345678"
16

Dernière modification par pingouinux (Le 17/10/2020, à 09:48)

Hors ligne

#7 Le 17/10/2020, à 09:50

Watael

Re : Couper une chaîne de caractère dans un fichier

merci.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 17/10/2020, à 19:16

Mehdouch

Re : Couper une chaîne de caractère dans un fichier

s="122862324313212465131261345231523415352163453136431326431045452542451214564225564321361650545210208814722066034489802044511230157626158697538374264328643428667972353241634912464340045467246640416437352023"

sed -r 's/(.)(.{4}|.{0,3}$)/\1/g' <<<"$s"

Ça marche très bien avec sed. C'est incroyable comment cette commande peut être utile.
Pouvez-vous juste m'expliquer la syntaxe pour que je puisse l'utiliser moi même dans le futur.
Et merci beaucoup.

Hors ligne

#9 Le 17/10/2020, à 20:44

pingouinux

Re : Couper une chaîne de caractère dans un fichier

Mehdouch #8 a écrit :

Pouvez-vous juste m'expliquer la syntaxe pour que je puisse l'utiliser moi même dans le futur.

sed 's/expression à remplacer/texte de remplacement/g' <<<"texte_qui_nous intéresse"

Le g final indique que l'on veut répéter l'opération sur la ligne.

(.)(.{4}|.{0,3}$)

(.) : 1 caractère quelconque
.{4} : suivi de 4 caractères quelconques
| : ou
.{0,3} : 0 à 3 caractères quelconques
$ : en fin de ligne

\1

C'est le contenu du couple de parenthèses correspondant à la 1ère parenthèse ouvrante de l'expression précédente (ici, le premier caractère d'une série de 5 (ou moins si on atteint la fin de ligne)).

Hors ligne

#10 Le 17/10/2020, à 22:12

Mehdouch

Re : Couper une chaîne de caractère dans un fichier

C'est parfait.. Merci pingouinux smile

Hors ligne

#11 Le 18/10/2020, à 03:31

nany

Re : Couper une chaîne de caractère dans un fichier

Bonjour,



pingouinux a écrit :
Watael a écrit :

pourquoi |.{0,3}$ ?

Parce que sinon, si le nombre de caractères n'est pas multiple de 5, il y a des caractères en trop.

$ sed -r 's/(.).{4}/\1/g' <<<"12345678"
1678

Ajouté :

$ sed -r 's/(.)(.{4}|.{0,3}$)/\1/g' <<<"12345678"
16
$ sed -E 's/(.).{0,4}/\1/g' <<<"12345678"
16

big_smile

Hors ligne

#12 Le 18/10/2020, à 05:48

pingouinux

Re : Couper une chaîne de caractère dans un fichier

Bien vu, nany ! Je me suis compliqué la vie, sur ce coup-là… smile

Hors ligne

#13 Le 18/10/2020, à 07:59

Zakhar

Re : Couper une chaîne de caractère dans un fichier

Mehdouch a écrit :

Pouvez-vous juste m'expliquer la syntaxe pour que je puisse l'utiliser moi même dans le futur.

big_smile

Si tu as la patience de lire un roman de 200 pages... on peut tenter l'explication de la syntaxe de sed.  cool

Et oui, c'est un outil super puissant pour manipuler des fichiers texte !


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne