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 ...
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 ...
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
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 ...
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 :
le fichier test3.txt était vide.
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
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)
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, unn'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 ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part awk ... ' ... if ($1=="'$vsoc'") ...'
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 :
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?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2# Vérifie si une chaine est en cours d'exécution
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é?
Autre question le tromquage est il aléatoire?
- 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
ca marche pas plus
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 awk ... ' ... if ($1=="'$vsoc'") ...'
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) ?
Taille fichier qui pose probleme
RAM et de swap
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 du -sk test.txt 8 test.txt
Espace disque disponible
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3free ksh: free: not found
Les quotas utilisateurs
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 repquota -a Disk quotas for user udevarch (uid 283): none
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'
non mon fichier n'est pas tronqué dans ce cas là
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?
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
Merci à tous
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 perl -pi -e 's/^1025/XXXXXXX/' <nom_fichier>
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager