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

Linux Discussion :

Problème de fichier tronqué lors d'un traitement avec AWK


Sujet :

Linux

  1. #21
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Attends, attends ...

    Est-ce que tu régénères ton fichier entre chaque essai ?

    Je sais, c'est une question idiote, mais personne n'est à l'abri de cette erreur, je l'ai bien commise en faisant les essais des codes que je t'ai passé ci dessus ...
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  2. #22
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    Voila la totalite de mon code


    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
    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
    62
    63
    64
     
    set -x
     
    # balayage de toutes les lignes du fichier de recuperation des dossiers
     
    REPBIN=/bin
     
    LIST="s1025 s1026"
     
    cd ../LOG_ARCH/
     
    # Pour chaque societaire de la liste
    for s in $LIST
    do
    	# recuperation du numero de societaire
    	integer SOC=$($REPBIN/echo $s | $REPBIN/awk '{print substr($0, length($0) - (length($0) - 2))}')
    	vsoc=$SOC
     
    	 # Vérifie si une chaine est en cours d'exécution
     
     
     
     
    	# on vérifie puis récupère dans les différents fichiers les données du societaire
     
    	if (($SOC >= 1 && $SOC < 100000)) then   v_arch="old_dc_vtm_*099999.txt"
    		elif (($SOC >= 100000 && $SOC < 200000)) then   v_arch="dc_*199999.txt"
    		elif (($SOC >= 200000 && $SOC < 300000)) then   v_arch="dc_*299999.txt"
    		elif (($SOC >= 300000 && $SOC < 400000)) then   v_arch="dc_*399999.txt"
    		elif (($SOC >= 400000 && $SOC < 500000)) then   v_arch="dc_*499999.txt"
    		elif (($SOC >= 500000 && $SOC < 600000)) then   v_arch="dc_*599999.txt"
    		elif (($SOC >= 600000 && $SOC < 700000)) then   v_arch="dc_*699999.txt"
    		elif (($SOC >= 700000 && $SOC < 800000)) then   v_arch="dc_*799999.txt"
    		elif (($SOC >= 800000 && $SOC < 900000)) then   v_arch="dc_*899999.txt"
    		elif (($SOC >= 900000 && $SOC < 1000000)) then  v_arch="dc_*999999.txt"
    	fi
     
     
    	for i in "$v_arch"
    	do
    		for j in $i
    		do
    			-- je "renomme" mon fichier car je m'en sers dans un autre traitement juste apres
    			j_charg=$($REPBIN/echo $j | $REPBIN/awk '{print substr($0, 1,length($0) - 18)}')
     
    			-- en fait comme j'ai plusieurs fichiers à traiter et qu'il risque d'etre
    			-- consequent je voudrais eviter de saturer notre disque
    			cat -u $j | awk -F'#' ' {
    						# si le champ1 contient le numéro du societaire
    						if ($1=='$vsoc')
    						{
    							OFS="#" 
    							$1="XXXXXXX"
    							print $0
    						}
    						else 
    						{
    							print $0
    						}
    						} ' > ../DAT/j_charg.dat	
     
    		done		
    	done
    done

  3. #23
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    As tu essayé de tester séparément ton 'cat | awk ...' sur un ou plusieurs des fichiers de données (dc_*199999.txt), avec sortie dans un nouveau fichier (pas 'sur place'), pour pouvoir les analyser finement et comparer.

    Une autre piste :
    fais ton 'cat | awk', mais dans le code du awk, tu ne fais que du 'print $0', et dans un fichier distinct de celui d'origine.
    Ensuite, tu fais un diff entre le fichier d'origine et celui de destination. Tu ne devrais pas trouver de différence, ou alors c'est qu'on a un grave problème (Allo, Houston, nous avons un problème ...)

    Encore une autre piste ...
    Cherchons la corruption dans les fichiers de données ...
    Tu prends un des fichiers dont le traitement te donne un fichier tronqué, et tu fais dessus un 'strings -e S' que tu redirige dans un fichier. Tu compares ensuite ce résultat avec le fichier d'origine (diff). Il ne devrait pas y avoir de différences ... (à part, quelquefois, les sauts de ligne et les accolades ... la procédure est à affiner, mais son objet est de repérer les caractères non supportés qui pourraient provoquer un arrêt du traitement)

    Et surtout, AVANT CHAQUE LANCEMENT, vérifie la qualité de tes fichiers de données qui sont en entrée ...
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  4. #24
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    Alors

    pour reprendre tes cas :

    dans le cas 1 : cat | awk avec fichier entree test1.txt <> fichier en sortie test2
    le résultat est ok.

    dans le cas 2 : cat | awk avec print $0 avec fichier entree test1.txt <> fichier en sortie test5.txt les résultat est ok.

    dans le cas 3 : je ne connais pas cette commande !!! comment fonctionne t-elle ?

    Autre Bizarrerie pendant l'execution de ces différents cas .

    quand j'ai effectué le cas 1 : le programme a créé le fichier test2.txt
    puis j'ai passé ma commande awk :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    cat -u ../LOG_ARCH/test2.txt | awk -F'#' ' {                                
    			# si le champ1 contient le numéro du societaire     
    			if ($1=='$vsoc')                                    
    			{                                                   
    				OFS="#"                                     
    				$1="XXXXXXX"                                
    				print $0                                    
    			}                                                   
    			else                                                
    			{                                                   
    				print $0                                    
    			}                                                   
    			} ' > ../LOG_ARCH/test3.txt
    le fichier test3.txt était vide.

    J'ai refait la même manip en repartant de mon fichier initial test.txt et là
    le fichier test3.txt était renseigné correctement .

    Comme ci le fait de repartir d'un fichier ayant déjà subit un traitement le génait (peut être effectivement des caractères bizarres qui trainent dans le fichier)

  5. #25
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Strings affiche les chaines de caractères contenues dans un fichier ... d'habitude, on s'en sert pour retrouver les noms de librairies et autres fantaisies contenues dans les binaires ...

    Je m'en sers aussi parfois sur des fichiers de texte (données d'entrée de scripts divers et variés) pour filtrer les scories que je ne peux/veux pas traiter.

    Sinon, le problème est toujours aussi nébuleux ...

    Un truc en passant, chez moi, un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk ... ' ... if ($1=='$vsoc') ...'
    n'utilise pas la variable d'environnement $vsoc. Pour l'utiliser, je suis obligé de 'sortir' du awk, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk ... ' ... if ($1=="'$vsoc'") ...'
    ($vsoc entre simple quotes, entre double quotes) ... je ne sais pas si ça a un rapport ...
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  6. #26
    Membre habitué Avatar de tretsois
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 181
    Points : 196
    Points
    196
    Par défaut
    Bonjour Delphine_Lep,
    Première question quel intepréteur choisit tu? Première ligne -> #! /bin/bash ou perl ou toto ... .

    Deuxième question quand tu pose dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    # Vérifie si une chaine est en cours d'exécution
    Comptes tu traiter ton fichier alors qu'il est déjà ouvert? Pour en venir au fait que peut être tu test des fichier dont l'acces peut-etre pris par un autre prog entre deux de tes accés?

    Troisième question les trois lignes de code que j'avais jetté sur le forum les as tu testé et quel était le résultat? était il aussi tromqué?
    la vie est belle

  7. #27
    Membre habitué Avatar de tretsois
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 181
    Points : 196
    Points
    196
    Par défaut
    Autre question le tromquage est il aléatoire?
    la vie est belle

  8. #28
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    - Non aucun programme n'accede à mon fichier pendant mon traitement
    le commentaire "Vérifie si une chaine est en cours d'exécution " est juste un commentaire que j'ai oublié de suppprimer...

    - sinon c'est #!/bin/sh

    - le tronquage n'est pas aléatoire il dépend juste de la taille du fichier en entrée

    - sinon j'ai testé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk ... ' ... if ($1=="'$vsoc'") ...'
    ca marche pas plus

  9. #29
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Plus le fichier est long, plus il a de chances d'être tronqué, c'est ça ?

    Quelle taille font les fichiers les plus longs ? (du -sk nom_fichier)
    Combien de RAM et de swap as tu ? (free)
    Combien d'espace disque disponible ? (df)
    Les quotas utilisateurs sont ils activés ? En est-on loin (quota / repquota -a) ?
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  10. #30
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    Taille fichier qui pose probleme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    du -sk test.txt
     
    8   test.txt
    RAM et de swap

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    free 
    ksh: free:  not found
    Espace disque disponible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    df
     
    Filesystem    512-blocks   Free    %Used    Iused %Iused Mounted on
    /dev/archive    1966080   1685920   15%     3053     2%  /archive
    Les quotas utilisateurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    repquota -a
     
    Disk quotas for user udevarch (uid 283): none

  11. #31
    Membre habitué Avatar de tretsois
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 181
    Points : 196
    Points
    196
    Par défaut
    Je sais que je suis tétu mais essais ca et dit si ton fichier est tronqué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #!/bin/bash 
     echo 'Recherche de toto dans test_1.txt et redirection vers titi.txt des lignes trouvées' 
     grep -a toto test.txt >> titi.txt 
     echo 'Fin de la recherche' 
     echo 'Recopie de test_1.txt avec le remplacement de toto par XXXX temp.txt' 
     grep -a "" test_1.txt | sed s/toto/XXXX/  >> temp.txt 
     echo 'Fin de la recopie ' 
     echo 'Ecrasement de test_1.txt par le fichier temp.txt' 
     mv temp.txt test_1.txt 
     echo 'Fin des opérations demandées'
    la vie est belle

  12. #32
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    non mon fichier n'est pas tronqué dans ce cas là

  13. #33
    Membre habitué Avatar de tretsois
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 181
    Points : 196
    Points
    196
    Par défaut
    Ben ca fait pres d'une semaine que tu galère.
    -> Peux-tu déjà te dépanner avec ces lignes ou bien ça plante ailleur?
    Même si tout est ok avec cette méthode, il faut trouver le pb que tu as car si tu as d'autres scripts à faire tu risque d'avoir d'autres problème.

    Ce qui m'etonnes c'est que celà n'est pas tromqué
    Essaye de tester ton script avec le même fichier sur un autre pc car la je commence à douter de ta config.
    bash --version
    awk --version
    sed --version
    egrep --version
    readline --version

    Quel est ta distrib ? ton noyaux? ton type de pc?
    la vie est belle

  14. #34
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    Voici la solution proposé par 2Eurocents et qui fonctionne très bien ...

    ca modifie les données directement dans le fichier en cours sans
    avoir à passer par un fichier intermédiaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    perl -pi -e 's/^1025/XXXXXXX/' <nom_fichier>
    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/01/2008, 16h28
  2. Réponses: 0
    Dernier message: 20/07/2007, 15h35
  3. le fichier log explose lors de la mise ajour!
    Par Babylonne dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 21/09/2006, 16h49
  4. Réponses: 2
    Dernier message: 21/06/2005, 21h18

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