Bonjour à tous
J'ai plusieurs fichier qui contiennent chacun une ligne précise que je souhaite utiliser dans un script. chacun des fichier présente sensiblement la morphologie suivante:
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
(ligne blanche 1)
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn (ligne non blanche)
ligne blanche 2)
maligne……………………………………………
Les nnnn indiquent des lignes quelconques et leur nombre varie. Mais la chose qui ne varie pas c'est:
- Une ligne vide (ligne blanche 1) ci-haut
- Une ligne occupée (ligne non blanche) ci-haut
- Une autre ligne vide (ligne blanche 2) ci-haut
- Et immédiatement la ligne qui m’intéresse (ma ligne en gras ci-dessus)
Dans tous les fichiers, le nombre de lignes (nnnnn) peut varier mais ma ligne (en gras) vient toujours après les trois lignes (vide, occupée, vide et ma_ligne).
Un autre détail c'est que cette ligne se présente dans tous les fichiers comme suit:
x y
C'est à dire une ligne qui n'a que deux chiffres séparés par un espace. Ici, x et y peuvent être 1, 2, 3…9
Dans mon script, je veux par exemple remplacer ma ligne par 2 2 pour avoir:
2 2
J'ai besoin de votre aide
Merci d'avance
# Bonjour
Posté par Marotte ⛧ . Évalué à 4.
C’est incompréhensible. Je me suis fait mal en te lisant.
1) Donne le fichier réel, en supprimant éventuellement des lignes s’il est trop long et en modifiant par endroit s’il y a des données qui doivent rester privées.
2) Utilise la syntaxe adéquate pour copier ce fichier dans ton prochain message, c’est expliqué ici.
3) Tu écris :
Quel script, je ne vois rien…
L’outil que tu cherches doit être sed et une expression régulière pour « matcher » deux chiffres séparés par une espace est assez facile à faire, tu devrais facilement y arriver en lisant le manuel.
# awk
Posté par GG (site web personnel) . Évalué à 4.
Regarde ce que tu peux faire avec awk.
Pas en ligne de commande, mais directement dans un script awk, tu seras plus à l'aise et ce sera plus facile de faire afficher des valeurs de contrôle/debug.
Bon courage
Pourquoi bloquer la publicité et les traqueurs : https://greboca.com/Pourquoi-bloquer-la-publicite-et-les-traqueurs.html
# Dernière ligne? Transitions
Posté par Michaël (site web personnel) . Évalué à 2.
Au cas où – comme ton exemple le suggère – ta ligne est la dernière, tu peux y accéder facilement avec l'e programme standard
tail
.Autrement, tu peux utiliser awk. Ta description nous explique que ton programme de recherche doit transiter par les états
Chaque ligne du fichier te fait passer d'un état à un autre, ou rester sur le même état, ou déclenche une erreur si ton fichier n'a pas la forme souhaitée.
Sinon tu peux lire tout ton fichier en mémoire avec awk et extraire ta ligne avec des expression rationnelles. Tu peux effacer toutes les lignes jusq'à un double saut en effaçant
([^\n]*\n)*\n\n
.# Un exercice
Posté par SlowBrain (site web personnel) . Évalué à 4.
C’est un exercice pour un cour d’informatique ?
[^] # Re: Un exercice
Posté par NeoX . Évalué à 3.
si c'est le cas, je propose la solution suivante :
et pour la prochaine fois :
- aller en cours ;)
# détails
Posté par OB.ph . Évalué à 1. Dernière modification le 09 avril 2017 à 08:46.
Merci à tous. peut être que je ne suis pas assez clair.
En fait, j'ai déjà un script qui traite mes fichiers et dans lequel il y a la commande suivante
sed -i '3,/^2/ d'
Commande que tout le monde connaît. Mon problème est que pour la plupart de mes fichiers, cette ligne commence par 2 et là il n'y a pas de problème. Mais dans quelques fichiers, cette ligne peut commencer par 0, 1, 3, 4 ou 5. J'aimerais simplement généraliser mon script pour qu'il efface de la ligne 3 (car les trois premières lignes ne changent jamais) jusqu'à ce que j'appelle ma ligne (2 1) en gras ci-dessous. Une autre précision, entre la ligne 3 et ma ligne, le nombre de ligne peut varier. Mais mon objectif c'est d'effacer de la ligne 3 à la ligne indiquée (2 1). Et c'est là que je suis bloqué. j'espère que c'est un peu clair maintenant.
voici l'extrait d'un de mes fichiers
[^] # Re: détails
Posté par NeoX . Évalué à 2.
on est d'accord que le 2 1 peut changer
mais sera troujours precedé par
suivi d'une ligne vide ?
si c'est le cas, il faut detecter ce motif fixe.
dans un cas comme le tient je fais un bete parseur
qui lit le fichier d'origine ligne par ligne
et active ou pas la copie de la ligne selinn des conditions
ca peut etre un compteur de ligne (ligne 1 à 3 on stock=1
puis on ne stocke plus (stock=0)
puis on detecte le motif A B, on remet stock=1
[^] # Re: détails
Posté par Marotte ⛧ . Évalué à 2.
https://fr.wikipedia.org/wiki/Expression_rationnelle#Classe_de_caract.C3.A8res
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.