IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Modification d'un fichier txt


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 282
    Par défaut Modification d'un fichier txt
    Bonjour,

    Je possède un fichier txt avec différentes lignes commençant par differentes lettres. Les chiffres sont les numéros de ligne.

    Par exemple

    1 A01...
    2 B08...
    3 C
    4 M
    5 A
    6 C
    7 A
    8 B
    9 M
    10A
    11B
    12A
    13B
    14A
    15B

    Je veux faire ressortir à partir de la ligne 10 (En gros toutes les lignes commencant par A suivi de B de A puis de B), toutes les lignes ayant comme critères soit 00 en position 47.

    Je ne sais pas si je me suis bien expliquer. Je suis débutant.

    J'ai quelqu'un à mon travail qui n'est plus là m'avait donné cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/bash
    IFS=
    #src_file=test.txt
    src_file=rsf.bakWriter.txt
     
    fichier_ligneA=ligneA.txt
     
    #cat $src_file | grep -n "^A.*" | cut -d: -f1 > $fichier_ligneA
     
    while read ligneA
    do
    	ligneBpotentielle=$(($ligneA+1))
    	ligneB_test=$(sed "$ligneBpotentielle!d" $src_file | egrep "^B.*")
    	if [ ! -z $(echo $ligneB_test) ]; then
    		echo $ligneBpotentielle
    	fi
    done < $fichier_ligneA
    Est ce que vous pouvez m'aider?
    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Difficile de comprendre ce que tu souhaites obtenir.

    En entrée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    A01...
    B08...
    C
    M
    A
    C
    A
    B
    M
    A
    B
    A
    B
    A
    B
    En sortie:
    Que faire de la partie allant de la ligne 12 à 15? Il s'agit aussi de A, B, A, B
    Que contiennent-elle après le A et le B, que des chiffres?

    Un exemple serait utile pour comprendre cette partie:
    toutes les lignes ayant comme critères soit 00 en position 47

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 73
    Par défaut
    Est-ce que tu pourrais reformuler ta demande, il est vrai que l'on est un peu perdu dans tes explications.

    toutes les lignes ayant comme critères soit 00 en position 47. ???

    Est-ce que tu aurais un exemple de rendu à nous donner ?

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 871
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Comme ecatomb, j'ai du mal à saisir...
    Pourquoi par exemple "à partir de la ligne 10" ? Est-ce que cette valeur 10 est donnée comme critère absolu ou bien est-ce que c'est parce que la ligne 10 est la première qui correspond à un motif particulier ?

    En ce qui concerne la recherche des lignes ayant "00" en position 47, ça c'est facile
    grep "^.\{46\}00" fichier...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 282
    Par défaut
    Bonsoir,

    je reviens vers vous avec un peu de retard.

    Voici quelques explications.

    Nous devons fournir un fichier txt définie par un organisme qui est l'ATIH. C'est le résumé des passages aux urgences.
    Il se décompose par plusieurs lignes commençant par des lettres. En premier c'est toujours une ligne commençant par la lettre A suivi d'une ligne soit par une lettre C ou M et B.

    A la fin du fichier, les lignes corresponds au payant. Elles sont toutes sous la forme de deux lignes. La première commençant par un A suivi d'un B puis A et B pour un autre dossier. Voir fichier joint.

    Le problème c'est qu'il augmente de mois en mois. Je cherche à connaître dans le fichier la première ligne commencant par un A suivi d'un B puis A suivi d'un B et ainsi de suite, c'est toujours à la fin du fichier. Puis à rajouté deux chiffres par exemple 00 à la fin des lignes commençant par A.

    Je ne sais pas si j'ai été clair.

    Merci d'avance
    Fichiers attachés Fichiers attachés

  6. #6
    Invité
    Invité(e)
    Par défaut
    C'est un peu plus clair, mais pas encore tout à fait.

    Peux-tu me dire si j'ai bien compris:
    A partir d'un moment, le fichier ne contient que des séries de 2 lignes (la 1ère commençant par A, la 2ème par B) sans aucune ligne commençant par autre chose entre ces séries.
    Tu cherches à connaitre cette ligne et à la modifier ainsi que les suivantes.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 282
    Par défaut
    Oui, c'est cela.

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 408
    Par défaut
    Bonjour,

    Si j'ai bien compris, voici un exemple en sed, qui rajoute TOTO à la fin des lignes commençant par A qui sont suivi par une ligne commençant par B:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ sed -e '/^A/{N;/\nB/s/\n/TOTO\n/;}' docu.txt
    A76000000011145016000102767000090715083U11001 010101190012607200926072009340000000252800002528000057000000399000001710000000000000000000002528
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    B76000000016811800010270900009071508307000 0126072009ATU  0010001000100025280000252810000002528000025280000000
    A76000000011145016000102706000000001444 110003000101190012203200922032009650000000000000000000000025280000252800000000000000000000000000000000TOTO
    B76000000018607762170840600000000144407000 0122032009ATU  0010001000100025280000252810000002528000025280000000
    A76000000022145016000102707000000059808 110003000101190012801200928012009650000000000000000000000025280000252800000000000000000000000000000000TOTO
    B76000000027401103871170700000005980807000 0128012009ATU  0010001000100025280000252810000002528000025280000000
    A76000000022145016000102707000000059808 110003000101190012901200929012009650000000000000000000000025280000252800000000000000000000000000000000TOTO
    B76000000027401103871170700000005980807000 0129012009ATU  0010001000100025280000252810000002528000025280000000

  9. #9
    Invité
    Invité(e)
    Par défaut
    A mon avis, le problème serait dans un cas comme celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A76000000011145016000102767000090715083U11001 010101190012607200926072009340000000252800002528000057000000399000001710000000000000000000002528
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    B76000000016811800010270900009071508307000 0126072009ATU  0010001000100025280000252810000002528000025280000000
    A76000000011145016000102706000000001444 110003000101190012203200922032009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000018607762170840600000000144407000 0122032009ATU  0010001000100025280000252810000002528000025280000000
    A76000000022145016000102707000000059808 110003000101190012801200928012009650000000000000000000000025280000252800000000000000000000000000000000
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    A76000000022145016000102707000000059808 110003000101190012901200929012009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000027401103871170700000005980807000 0129012009ATU  0010001000100025280000252810000002528000025280000000
    A avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A76000000011145016000102767000090715083U11001 010101190012607200926072009340000000252800002528000057000000399000001710000000000000000000002528
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    B76000000016811800010270900009071508307000 0126072009ATU  0010001000100025280000252810000002528000025280000000
    A76000000011145016000102706000000001444 110003000101190012203200922032009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000018607762170840600000000144407000 0122032009ATU  0010001000100025280000252810000002528000025280000000
    A76000000022145016000102707000000059808 110003000101190012801200928012009650000000000000000000000025280000252800000000000000000000000000000000
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    A76000000022145016000102707000000059808 110003000101190012901200929012009650000000000000000000000025280000252800000000000000000000000000000000TOTO
    B76000000027401103871170700000005980807000 0129012009ATU  0010001000100025280000252810000002528000025280000000
    [Edit]Je pensais à faire ceci, mais il existe peut être quelque chose de plus simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    $ cat test.txt
    A76000000011145016000102767000090715083U11001 010101190012607200926072009340000000252800002528000057000000399000001710000000000000000000002528
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    B76000000016811800010270900009071508307000 0126072009ATU  0010001000100025280000252810000002528000025280000000
    A76000000011145016000102706000000001444 110003000101190012203200922032009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000018607762170840600000000144407000 0122032009ATU  0010001000100025280000252810000002528000025280000000
    A76000000022145016000102707000000059808 110003000101190012801200928012009650000000000000000000000025280000252800000000000000000000000000000000
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    A76000000022145016000102707000000059808 110003000101190012901200929012009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000027401103871170700000005980807000 0129012009ATU  0010001000100025280000252810000002528000025280000000
     
    $ numero=$(egrep -n "^C|^M" test.txt | tail -1 | cut -d":" -f 1)
     
    $ head -$numero test.txt > fin.txt
     
    $ tail -n +$((numero+1)) test.txt | sed 's/^\(A.*\)/\1TOTO/' >> fin.txt
     
    $ cat fin.txt
    A76000000011145016000102767000090715083U11001 010101190012607200926072009340000000252800002528000057000000399000001710000000000000000000002528
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    B76000000016811800010270900009071508307000 0126072009ATU  0010001000100025280000252810000002528000025280000000
    A76000000011145016000102706000000001444 110003000101190012203200922032009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000018607762170840600000000144407000 0122032009ATU  0010001000100025280000252810000002528000025280000000
    A76000000022145016000102707000000059808 110003000101190012801200928012009650000000000000000000000025280000252800000000000000000000000000000000
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    A76000000022145016000102707000000059808 110003000101190012901200929012009650000000000000000000000025280000252800000000000000000000000000000000TOTO
    B76000000027401103871170700000005980807000 0129012009ATU  0010001000100025280000252810000002528000025280000000

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 282
    Par défaut
    Cela marche mais il me rajoute une ligne entre le B et le A suivante en y mettant TOTO.

    Par exemple:

    A
    B
    TOTO
    A
    B
    TOTO
    A
    ...

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 282
    Par défaut
    Non cela marche.

    Je voudrais vous demander aussi quelque chose sur le même fichier. Dans ce fichier si je devais changer un caractère à une certaine position.

    à partir de ces deux lignes A et B je dois changer en position 46 le 3 en 1.

    Comment dois je m'y prendre.

    Merci

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 282
    Par défaut
    Merci pour ta réponse Sve@r

    Je vais essayer ta solution.

  13. #13
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 299
    Par défaut
    bonjour,

    • Le seul caractère que l'on est sûr de ne pas trouver dans la ligne est \n. Il vaut mieux le garder que de mettre toto.
    • Comme le fichier grandit de mois en mois, ne vaut-il pas mieux utiliser tail -n 2 dans une boucle while plutôt que parcourir tout le fichier encore et encore
    • Les cas de bugs sont nombreux avec la technique ci-dessus: AABABABA, ABCB, ABA


    Résumé:
    1. On tire les deux dernières lignes jusqu'à ce qu'on ait pas AB
    2. On les transforme
    3. On les réinjecte

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 871
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par islande Voir le message
    Il se décompose par plusieurs lignes commençant par des lettres. En premier c'est toujours une ligne commençant par la lettre A suivi d'une ligne soit par une lettre C ou M et B.

    A la fin du fichier, les lignes corresponds au payant. Elles sont toutes sous la forme de deux lignes. La première commençant par un A suivi d'un B puis A et B pour un autre dossier. Voir fichier joint.
    Pas simple mais heureusement qu'il y a l'exemple
    Donc tu as un entête contenant
    Axxxxxxxx
    Cxxxxxxxx ou bien Mxxxxxxxxxxx
    Bxxxxxxxx
    Donc en fait, 3 lignes quoi !!! (mais peut-être plus)

    Après ces 3 lignes, tu as
    AxxxxxxxxxPayant1
    BxxxxxxxxxPayant1
    AyyyyyyyyPayant2
    ByyyyyyyyPayant2
    etc etc (mais toujours un couple de 2 lignes)

    Citation Envoyé par islande Voir le message
    Le problème c'est qu'il augmente de mois en mois. Je cherche à connaître dans le fichier la première ligne commencant par un A suivi d'un B puis A suivi d'un B et ainsi de suite, c'est toujours à la fin du fichier. Puis à rajouté deux chiffres par exemple 00 à la fin des lignes commençant par A.
    Moi, avec un tel fichier "à la con", je te proposerais un code Python. Déjà c'est un langage intégré en natif dans Linux mais possible d'être installé sous Windows, et assez souple question prog pour pouvoir te donner un code évolutif (ici je pense que ça peut servir...)
    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import sys
     
    # Suppression lignes d'en-tête
    def head(fp):
    	# Traitement fichier
    	ligne=[None, None]
    	while True:
    		# Décalage précédente ligne lue
    		ligne[0]=ligne[1]
     
    		# Lecture nouvelle ligne
    		ligne[1]=fp.readline()
     
    		# Si EOF
    		if ligne[1] == "": break
     
    		# Si ligne 1 et ligne 2 commencent par A et B
    		if None not in ligne\
    		and ligne[0][0] == "A"\
    		and ligne[1][0] == "B":
    			# On a trouvé le début des dossiers
    			# On se recule de 2 lignes
    			fp.seek(-len(ligne[0] + ligne[1]), 1)
    			break
    		# if
    	# while
    # head()
     
    # Traitement dossiers
    def traitement(fp):
    	# Lecture des lignes couple par couple
    	while True:
    		ligne=[
    			fp.readline(),
    			fp.readline(),
    		]
     
    		# Si EOF
    		if "" in ligne: break
     
    		# Suppression "\n" de fin de ligne
    		for i in xrange(len(ligne)):
    			while ligne[i].rfind("\n") != -1:
    				ligne[i]=ligne[i][0:-1]
    		# for
     
    		# La ligne 0 commence par "A" et la ligne 1 par "B"
    		print "%s => c'est la ligne A" % ligne[0]
    		print "%s => c'est la ligne B" % ligne[1]
    	# while
    # traitement
     
    if __name__ == "__main__":
    	fp=open(sys.argv[1], "r")
    	head(fp)
    	traitement(fp)
    	fp.close()
    # if

    Tu sauvegardes ce code dans un fichier "toto.py" puis tu appelles python toto.py fichier.txt. Ou bien tu rajoutes un droit "x" au fichier "toto.py" et te suffit d'appeler ./toto.py fichier.txt (exactement comme un script shell)...

    Citation Envoyé par islande Voir le message
    Je voudrais vous demander aussi quelque chose sur le même fichier. Dans ce fichier si je devais changer un caractère à une certaine position.

    à partir de ces deux lignes A et B je dois changer en position 46 le 3 en 1.
    Ben justement, j'ai bien fait de parler d'évolutivité !!!

    Te suffit de travailler sur ligne[0] et ligne[1] dans la fonction "traitement"

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # Traitement dossiers
    def traitement(fp):
    	# Lecture des lignes couple par couple
    	while True:
    		ligne=[
    			fp.readline(),
    			fp.readline(),
    		]
     
    		# Si EOF
    		if "" in ligne: break
     
    		# Suppression "\n" de fin de ligne
    		for i in xrange(len(ligne)):
    			while ligne[i].rfind("\n") != -1:
    				ligne[i]=ligne[i][0:-1]
    		# for
     
    		# La modification "à la con" (attention, les indices sont numérotés à partir de 0 => modifier le caractère 46 impliquera d'aller à l'indice 45)
    		ligne[0][45]="1"
    		ligne[1][45]="1"
     
    		# La ligne 0 commence par "A" et la ligne 1 par "B"
    		print "%s => c'est la ligne A" % ligne[0]
    		print "%s => c'est la ligne B" % ligne[1]
    	# while
    # traitement

    Attention, ce code te donne un fichier modifié "à l'écran" mais ne touche pas au fichier original. Tu as parlé plusieurs fois de "modifier" le fichier mais je ne sais pas si tu entendais "le modifier à l'affichage" ou bien si tu veux réellemment le modifier sur disque...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par islande Voir le message
    Non cela marche.

    Je voudrais vous demander aussi quelque chose sur le même fichier. Dans ce fichier si je devais changer un caractère à une certaine position.

    à partir de ces deux lignes A et B je dois changer en position 46 le 3 en 1.

    Comment dois je m'y prendre.

    Merci
    Il suffit de choisir la ligne tail qui te convient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    numero=$(egrep -n "^C|^M" test.txt | tail -1 | cut -d":" -f 1)
    head -$numero test.txt > fin.txt
    tail -n +$((numero+1)) test.txt | sed 's/^\(A.\{44\}\).\(.*\)/\11\2TOTO/' >> fin.txt #changer le caractère 46 en 1 peu importe sa valeur
    tail -n +$((numero+1)) test.txt | sed 's/^\(A.\{44\}\)3\(.*\)/\11\2TOTO/' >> fin.txt #changer le caractère 46 en 1 si c'est un 3
    tail -n +$((numero+1)) test.txt | sed 's/^\(A.\{44\}\)3/\11/' >> fin.txt #idem sans ajouter toto à la fin

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 282
    Par défaut
    Suite à ta réponse Sve@r, j'ai essayer ton script et oui je cherche à le modifier en créant un fichier2.txt avec les modifs.

    Je cherche simplement à rajouter soit TOTO ou un chiffre comme 66 à toutes les lignes A. Bien sur aux couples de lignes A et B suivi d'un autre couples de lignes A et B.

    Merci

  17. #17
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 408
    Par défaut
    Ok, donc a ce que je comprends, il ne faut modifier que les lignes A suivi de B qu'a partir du moment où l'on ne rencontre que des lignes A et B jusque la fin du fichier donc que les ligne en rouge ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $ cat docu.txt
    A76000000011145016000102767000090715083U11001 010101190012607200926072009340000000252800002528000057000000399000001710000000000000000000002528
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    B76000000016811800010270900009071508307000 0126072009ATU  0010001000100025280000252810000002528000025280000000
    A76000000011145016000102706000000001444 110003000101190012203200922032009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000018607762170840600000000144407000 0122032009ATU  0010001000100025280000252810000002528000025280000000
    A76000000022145016000102707000000059808 110003000101190012801200928012009650000000000000000000000025280000252800000000000000000000000000000000
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    A76000000022145016000102707000000059808 110003000101190012901200929012009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000027401103871170700000005980807000 0129012009ATU  0010001000100025280000252810000002528000025280000000
    A76000000011145016000102767000090715083U11001 010101190012607200926072009340000000252800002528000057000000399000001710000000000000000000002528
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    B76000000016811800010270900009071508307000 0126072009ATU  0010001000100025280000252810000002528000025280000000
    A76000000011145016000102706000000001444 110003000101190012203200922032009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000018607762170840600000000144407000 0122032009ATU  0010001000100025280000252810000002528000025280000000
    A76000000022145016000102707000000059808 110003000101190012801200928012009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000027401103871170700000005980807000 0128012009ATU  0010001000100025280000252810000002528000025280000000
    A76000000022145016000102707000000059808 110003000101190012901200929012009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000027401103871170700000005980807000 0129012009ATU  0010001000100025280000252810000002528000025280000000
    
    Voici un exemple toujours en sed (et tac pour aborder le problème à l'envers):
    Ici, on lit le fichier de la dernière ligne à la première, puis le sed modifie le 46ème caractère, par 6__TOTO__ si ce caractère est un 3, des lignes qui commence par A si cette ligne est précédé d'un B (puisque qu'on lit le fichier à l'envers) et ceci tant que l'on ne rencontre pas de ligne qui ne commence par B et/ou suivi d'une ligne commençant par A puis pour finir on remet le fichier à l'endroit (pas super claire, l'explication )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $ tac docu.txt | sed -ne '/^[^B]/{:bb;p;n;bbb;};/^B/{N;/\n[^A]/bbb;/\nA/s/\(\n.\{45\}\)3/\16___TOTO___/p;}' | tac
    A76000000011145016000102767000090715083U11001 010101190012607200926072009340000000252800002528000057000000399000001710000000000000000000002528
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    B76000000016811800010270900009071508307000 0126072009ATU  0010001000100025280000252810000002528000025280000000
    A76000000011145016000102706000000001444 110003000101190012203200922032009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000018607762170840600000000144407000 0122032009ATU  0010001000100025280000252810000002528000025280000000
    A76000000022145016000102707000000059808 110003000101190012801200928012009650000000000000000000000025280000252800000000000000000000000000000000
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    A76000000022145016000102707000000059808 110003000101190012901200929012009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000027401103871170700000005980807000 0129012009ATU  0010001000100025280000252810000002528000025280000000
    A76000000011145016000102767000090715083U11001 010101190012607200926072009340000000252800002528000057000000399000001710000000000000000000002528
    C76000000016811800010270900009071508307000 0126072009C   N0010001000100022000000570007000003990000057000000000
    B76000000016811800010270900009071508307000 0126072009ATU  0010001000100025280000252810000002528000025280000000
    A76000000011145016000102706000000001444 110006___TOTO___000101190012203200922032009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000018607762170840600000000144407000 0122032009ATU  0010001000100025280000252810000002528000025280000000
    A76000000022145016000102707000000059808 110006___TOTO___000101190012801200928012009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000027401103871170700000005980807000 0128012009ATU  0010001000100025280000252810000002528000025280000000
    A76000000022145016000102707000000059808 110006___TOTO___000101190012901200929012009650000000000000000000000025280000252800000000000000000000000000000000
    B76000000027401103871170700000005980807000 0129012009ATU  0010001000100025280000252810000002528000025280000000
    

  18. #18
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 871
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par islande Voir le message
    Suite à ta réponse Sve@r, j'ai essayer ton script et oui je cherche à le modifier en créant un fichier2.txt avec les modifs.
    Bah, ./toto.py fichier1.txt >fichier2.txt.

    C'est un gros pb que de modifier un fichier qu'on est en train de traiter. C'est faisable mais c'est bien bien chiant. Surtout si la modif rajoute des infos !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #19
    Invité
    Invité(e)
    Par défaut
    @disedorgue: je ne connaissait pas tac, faut que je me le note dans un coin. Ca me sera utile à un moment ou un autre

  20. #20
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 871
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ecatomb Voir le message
    @disedorgue: je ne connaissait pas tac, faut que je me le note dans un coin.
    Humour des développeurs Linux. tac, inverse de cat, affiche un fichier depuis la fin vers le début
    Citation Envoyé par ecatomb Voir le message
    Ca me sera utile à un moment ou un autre
    Moi ça ne me l'a jamais été. Mais qui sait... le jour où tu veux afficher un fichier dans le bon sens tu pourras toujours faire tac fichier |tac...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème modification d'un fichier txt
    Par YoshioToutou dans le forum C
    Réponses: 6
    Dernier message: 21/03/2011, 00h10
  2. modification d'un fichier .txt
    Par juliejuliejulie dans le forum MATLAB
    Réponses: 6
    Dernier message: 23/03/2010, 10h43
  3. [Batch] Modification d'un fichier txt par glisser/déposer
    Par L.rod dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 18/09/2009, 14h41
  4. Ouverture et modification d'un fichier .txt
    Par Marty McFly dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 22/05/2006, 10h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo