#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
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
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
Hors ligne
#11 Le 18/10/2020, à 03:31
- nany
Re : Couper une chaîne de caractère dans un fichier
Bonjour,
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
En 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à…
Hors ligne
#13 Le 18/10/2020, à 07:59
- Zakhar
Re : Couper une chaîne de caractère dans un fichier
Pouvez-vous juste m'expliquer la syntaxe pour que je puisse l'utiliser moi même dans le futur.
Si tu as la patience de lire un roman de 200 pages... on peut tenter l'explication de la syntaxe de sed.
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