Ajouter une mot en fin de ligne [Résolu/Fermé]

Signaler
Messages postés
6
Date d'inscription
mardi 12 août 2008
Statut
Membre
Dernière intervention
12 août 2008
-
Messages postés
6
Date d'inscription
mardi 12 août 2008
Statut
Membre
Dernière intervention
12 août 2008
-
Bonjour à tous,

J'ai un fichier du type:

LEC000315L 180874 KLC0171816G_1 10
LAB69020 178968 LAB69020_1 10
LAB69079 179970 LAB69079_1 12
LAB69212 179971 LAB69212_1 24
NOVN32928N 176794 ZNOVN32928_1 98

J'aimerais ajouter le mot "FIN" à la fin de chacune des ligne à la même position.

pour obtenir ceci:
LEC000315L 180874 KLC0171816G_1 10 FIN
LAB69020 178968 LAB69020_1 10 FIN
LAB69079 179970 LAB69079_1 12 FIN
LAB69212 179971 LAB69212_1 24 FIN
NOVN32928N 176794 ZNOVN32928_1 98 FIN

Voici mon script:

NB_LIGNES=`awk 'END {print NR}' $2`
NUM_LIGNE=1
LG_LIGNE=202

until [ "$NUM_LIGNE" = "$NB_LIGNES" ]
do
NB_CAR=`head -$NUM_LIGNE $2 |tail -1|wc -c`

NB_ESP=`expr $LG_LIGNE - $NB_CAR`
IND=1
STRI="fin "
until [ "$IND" = "$NB_ESP" ]
do
STRI=" $STRI"
IND=`expr $IND + 1`
done

sed -e "$NUM_LIGNE s/.*/&$STRI/" $2 >> /share/PN4000/Part.txt

NUM_LIGNE=`expr $NUM_LIGNE + 1`
done

Mon problème c'est que la commande sed recopie le fichier au complet à chaque passage.

Comment faire pour ne modifier que la ligne courante?
Merci pour vos réponses!

8 réponses

Messages postés
6
Date d'inscription
mardi 12 août 2008
Statut
Membre
Dernière intervention
12 août 2008

Merci beaucoup à tous pour votre aide.
Une ligne de code pour ce traitement c'est très optimal.
:-)
Messages postés
6
Date d'inscription
mardi 12 août 2008
Statut
Membre
Dernière intervention
12 août 2008

Dans mon cas ce n'est pas nécessaire de connaître la ligne la plus longue, car la longueur maximale est déterminée à l'avance et elle est fixe.

Merci
:-)
Voilà, ça devrait marcher ;)

sed 's/$/ FIN/g' fichier
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 742
Salut,

Tu t'embêtes pour rien :
$ cat fichier.txt
LEC000315L 180874 KLC0171816G_1 10
LAB69020 178968 LAB69020_1 10
LAB69079 179970 LAB69079_1 12
LAB69212 179971 LAB69212_1 24
NOVN32928N 176794 ZNOVN32928_1 98
$ sed 's/.*/& FIN/' fichier.txt
LEC000315L 180874 KLC0171816G_1 10 FIN
LAB69020 178968 LAB69020_1 10 FIN
LAB69079 179970 LAB69079_1 12 FIN
LAB69212 179971 LAB69212_1 24 FIN
NOVN32928N 176794 ZNOVN32928_1 98 FIN
$
;-))
Messages postés
6
Date d'inscription
mardi 12 août 2008
Statut
Membre
Dernière intervention
12 août 2008

Salut,

Merci pour ta réponse!

Chaque ligne est de longueur différente et le mot FIN doit toujours être à la même position à la fin de la ligne. genre à la colonne 35.

Est-ce que ton code peux s'adapter à ce besoin?

Merci!
la commande sed permet de positionner le mot 'FIN' à la fin de toutes les lignes de ton fichier.
Messages postés
18156
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
9 juillet 2020
4 894
A la colonne 35 exactement:
awk '{printf("%-33s FIN\n", $0)}' < fichier.txt
Messages postés
6
Date d'inscription
mardi 12 août 2008
Statut
Membre
Dernière intervention
12 août 2008

Merci beaucoup pour votre aide!
Ça fonctionne au poil!
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 742
C'est moins joli avec "sed" qu'avec "awk" mais bon, si ça peut servir :
$ cat fichier.txt
LEC000315L 180874 KLC0171816G_1 10
LAB69020 178968 LAB69020_1 10
LAB69079 179970 LAB69079_1 12
LAB69212 179971 LAB69212_1 24
NOVN32928N 176794 ZNOVN32928_1 98
$ sed ':z;s/^.\{,33\}$/& /;t z; s/.*/&FIN/' fichier.txt
LEC000315L 180874 KLC0171816G_1 10FIN
LAB69020 178968 LAB69020_1 10     FIN
LAB69079 179970 LAB69079_1 12     FIN
LAB69212 179971 LAB69212_1 24     FIN
NOVN32928N 176794 ZNOVN32928_1 98 FIN
$ 
;-))
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 474
Salut,

une solution vraiment optimale sera de calculer la longueur de la ligne la plus grande, et l'utiliser pour positionner le mot FIN

Voilà ce qui donne si le nombre des champs n'est pas bien choisi
lami20j@debian:~$ cat req
LEC000315L 180874 KLC0171816G_1 10
LAB69020 178968 LAB69020_1 10
LAB69079 179970 LAB69079_1 12
LAB69212 179971 LAB69212_1 24
NOVN32928N 176794 ZNOVN32928_1 98
lami20j@debian:~$ awk '{printf("%-33s FIN\n", $0)}' < req
LEC000315L 180874 KLC0171816G_1 10 FIN
LAB69020 178968 LAB69020_1 10     FIN
LAB69079 179970 LAB69079_1 12     FIN
LAB69212 179971 LAB69212_1 24     FIN
NOVN32928N 176794 ZNOVN32928_1 98  FIN
lami20j@debian:~$ awk '{printf("%-33s FIN\n", $0)}' < req | perl -ne 'print length $1,"\n" if /^(.+)FIN/'
35
34
34
34
35
lami20j@debian:~$ awk '{printf("%-40s FIN\n", $0)}' < req | perl -ne 'print length $1,"\n" if /^(.+)FIN/'
41
41
41
41
41
Si j'augmente le nombre de champs alors tout va bien ;-)