Forum Linux.debian/ubuntu repérer une ligne précise dans un fichier

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
7
avr.
2017

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  . É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 :

    Dans mon script, je veux …

    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  (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  (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

    1. Sauter lignes nnn
    2. Sauter ligne blanche 1
    3. Sauter ligne intermédiaire
    4. Sauter ligne blanche 2
    5. Lire ma ligne

    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  (site web personnel) . Évalué à 4.

    • Énoncé flou et alambiqué, sans réel exemple concret.
    • Utilisateur sans aucun autre contenu, commentaire …

    C’est un exercice pour un cour d’informatique ?

    • [^] # Re: Un exercice

      Posté par  . Évalué à 3.

      si c'est le cas, je propose la solution suivante :

      • lire le cours
      • comprendre le cours
      • appliquer le cours

      et pour la prochaine fois :
      - aller en cours ;)

  • # détails

    Posté par  . É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

    %nprocshared=2
    %rwf=name.rwf
    %mem=2GB
    %lindaworkers=cnode0601.cm.cluster,cnode0603.cm.cluster
    %nosave
    %chk=C:\name.chk
    # freq 6-31++g(d,p) scrf=check guess=tcheck geom=(connectivity,allcheck)
    genchk rm062x

    name of job

    2 1
    H 1 B1
    H 1 B2 2 A1
    H 1 B3 3 A2 2 D1 0
    N 1 B4 3 A3 2 D2 0
    H 5 B5 1 A4 3 D3 0
    H 5 B6 1 A5 3 D4 0
    H 5 B7 1 A6 3 D5 0

    • [^] # Re: détails

      Posté par  . Évalué à 2.

      on est d'accord que le 2 1 peut changer
      mais sera troujours precedé par

      name of job

      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  . Évalué à 2.

      sed -i '3,/^2/ d'

      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.

      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.