Alors voici le résumé du script qui fonctionne sur mes fichiers DOS encodés en latin1.
Rappel de ce que l'on veut faire :
On a un fichier source avec des lignes du genre :
fjdlj fjqfmldjklfjd lkfjdsqk jfdqjmfkdqkfd123 7653 12 #
En fait, les 3 dernières colonnes de 8 caractères correspondent à des nombres pour l'année en cours, l'année n-1 et l'année n-2.
Le but est de mettre l'année en cours à 0 et de décaler les deux autres colonnes afin d'obtenir une ligne du genre :
fjdlj fjqfmldjklfjd lkfjdsqk jfdqjmfkdqkfd0 123 7653 #
Par ailleurs, il faut que tout soit automatisé (lancé par une crontab chaque 1er janvier).
Rappel des contraintes :
Les fichiers doivent être accessibles à de vieux programmes Basic, donc pas question de trop les perturber.
Ils sont au format DOS (avec des CR LF en fin de ligne) et encodés en latin1.
Pour que sed les parse bien, il faut qu'ils soient en unix (que des LF en fin de ligne) et encodés en utf-8.
(En tout cas, c'est ce qui a marché sur ma config...)
Mise en oeuvre de la solution :
Créer les deux fichiers suivants (des scripts pour vi) :
encoding2latin1.vim
:set fileencoding=latin1^M:wq
encoding2utf8.vim
:set fileencoding=utf-8^M:wq
Puis créer le script suivant qui effectuera les opérations voulues :
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
|
#!/bin/bash
INPUTFILE="MON-FICHIER-SOURCE.txt"
TMPFILE="/tmp/TMP-$$.LIS" # Edité suite au conseil de Sve@r
BACKUPFILE="${INPUTFILE}.1"
cp $INPUTFILE $BACKUPFILE
cp $INPUTFILE $TMPFILE
dos2unix $TMPFILE
vi -s encoding2utf8.vim $TMPFILE
# on mémorise le dernier caractere en le mettant entre parenthèses,
# on substitue les 8 avant derniers et le dernier par le dernier qui a été
# mémorisé dans la mémoire \1.
# Ensuite, on substitue les 17 derniers car par "0 "suivi des 16
# derniers car mémorisés en mémoire 1.
sed -i -e 's/.\{8\}\(.\)$/\1/' -e 's/\(.\{17\}\)$/0 \1/' $TMPFILE
vi -s encoding2latin1.vim $TMPFILE
unix2dos $TMPFILE
cp -f $TMPFILE $INPUTFILE |
Ce n'est sûrement pas le script le plus simple pour réaliser cette fonction, mais il a le mérite de fonctionner !
Merci à tous pour votre aide précieuse !
TanaT
Partager