Hello,
J'ai un probleme tout a fait mystique : j'ai developpe un script AWK sur un Linux 2.4.20, et il fonctionne parfaitement. Le souci, c'est que des que je l'envoie sur un HP-UX, il y a un tout petit bug qui foire toute ma sortie, explication :
En gros le script remplace des caracteres suivant des conditions precises dans un fichier de 1000 lignes environ.
Voici les fichiers en cause sous Linux :
[11:36][yom@rocky][~/LDCom/BMP2/Scripts] wc -c FieldValid-Correction.awk
1013 FieldValid-Correction.awk
[11:37][yom@rocky][~/LDCom/BMP2/Scripts] wc -c reprise.TOTALE 268464 reprise.TOTALE
[11:37][yom@rocky][~/LDCom/BMP2/Scripts] ./FieldValid-Correction.awk < reprise.TOTALE |wc -c 197064
|
On voit bien le nombre de caracteres produits en sortie. Voici maintenant les memes fichiers, et les memes manips, quand on les execute sous HP-UX :
bmpadma@ehptbmp2 > wc -c FieldValid-Correction.awk
1013 FieldValid-Correction.awk
bmpadma@ehptbmp2 > wc -c reprise.TOTALE 268464 reprise.TOTALE
bmpadma@ehptbmp2 > FieldValid-Correction.awk < reprise.TOTALE |wc -c
197892
|
Voila.
J'ai donc recherche ou se situait la difference de taille entre les sorties, et voici ce que j'ai trouve : l'un des champs traites par le script est aggrandi sous HP-UX ! :
Linux:
60604 20030312 210309 00006 00006 00011 0 100052072 00 003 XXXXXXXX32649.... 000 XXXXXXXXXXXXXXXXX 117 XXXXX05607367.... 117 XXXXX05607367.... 00 1 10 LD 00393-03596 HM02BI XD34SS 00000 |
HP-UX:
60604 20030312 210309 00006 00006 00011 0 100052072 00 003 XXXXXXXXX32649.... 000 XXXXXXXXXXXXXXXXX 117 XXXXX05607367.... 117 XXXXX05607367.... 00 1 10 LD 00393-03596 HM02BI XD34SS 00000 |
(je precise que j'ai remplace par des . certaines informations confidentielles, histoire de pas avoir de problemes)
Comme on le voit, le script a ajoute un X a la colonne n.11
Le probleme, c'est que le script utilise la meme fonction pour traiter les colonnes 11, 13, 15 et 17, et que c'est uniquement la colonne 11 qui est touchee.
Si un genie pouvait donc m'orienter, ca m'aiderait beaucoup. Voici le code complet du script :
#!/usr/bin/awk -f
BEGIN {}
{
num1 = $11
num2 = $13
num3 = $15
num3nat = $14
num4 = $17
num4nat = $16
num1 = repair($10,$11)
num2 = repair($12,$13)
num3 = repair($14,$15)
num4 = repair($16,$17)
if (num1 == "Broken" || num2 == "Broken" || num3 == "Broken" || num4 == "Broken" ) {
} else {
print substr($0,0,60) num1 substr($0,77,5) num2 substr($0,99,5) num3 substr($0,121,5) num4 substr($0,143)
}
}
END {}
function repair(nature,field)
{
if (field == "XXXXXXXXXXXXXXXXX" ) {
return field;
}
if (nature == "003" || nature == "116" ) {
minlength = 5
} else if (nature == "004" || nature == "117" ) {
minlength = 6
} else {
return "Broken";
}
for (i = 1; i < 18 ; i ++) {
digit = substr(field, i, 1)
if (digit == "X" ) {
last = "X"
} else if (digit <= 9 && digit >= 0) {
if (last == "X" ) {
start = 1
last = digit
} else {
start ++
}
} else if (start <= minlength) {
return "Broken";
} else if (start > minlength) {
field = substr(field, 1, i-1)"0"substr(field,i+1,18)
}
}
return field } |
Merci d'avance pour l'aide des plus vaillants qui ont suivi jusqu'au bout
Message édité par YupYup le 20-03-2003 à 11:51:49