Forum Programmation.shell Comment modifier chaque ligne dans un fichier ?

Posté par  .
Étiquettes : aucune
0
19
déc.
2005
bonjour a tous,

Comment modifier chaque ligne dans un fichier ?
je souhaite incrémenté chaque ligne

voici mon fichier ( toto.txt):
1245;tous;ok;78y9;local;14587
numer;tous;ok;7d89;local;12457
g1245;tous;ok;7d89;local;124587
TY1245;tous;ok;7849;local;12487

voici mon script:
fic=`cat toto`
for n in $fic
do
num=`expr 12 + 1`
awk 'BEGIN {flag=0}; /tous/ {flag=1;} flag==1 { print "$num"$0}' $fic
done

Mais ça marche pas !!
le résultat que je souhaite:

13;tous;ok;78y9;local;14587
14;tous;ok;7d89;local;12457
15;tous;ok;7d89;local;124587
16;tous;ok;7849;local;12487

Merci pour toutes réponses.
  • # pas dure

    Posté par  . Évalué à 1.

    nbl = 1
    while $( read ligne < fich.txt )
    do
    echo "$nbl $ligne"
    nbl=$(( $nbl + 1 ))
    done

    voila peut etre remplacer le
    while $( read ligne < fich.txt )
    par
    cat fich.txt | while read ligne

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • # Awk

    Posté par  . Évalué à 1.

    moi j'aime bien awk...


    awk "BEGIN{num=13}{print num\";\"$0;num++}" toto.txt
  • # ce qui se comprend bien s'exprime clairement, tout ca...

    Posté par  . Évalué à 1.

    si je me fie au resultat que tu dis souhaiter alors en bash dans un environnement GNU:

    cut -d';' -f2- toto.txt | paste -d';' <(seq -f"l%g" 3 $(wc -l < toto.txt)) - > output.txt

    doit le faire.

    cependant ton probleme est trop mal exposé pour fournir une reponse exacte, essaye de le decrire avec des mots en exposant les transformations que tu veux effectuer sur toutes les lignes et les eventuelles variables dont dependraient ces transformations (numero de la ligne courante, etc...) et non du code que tu ne maitrises pas.
    • [^] # oups...

      Posté par  . Évalué à 1.

      $(wc -l < toto.txt)
      est a remplacer par
      $((3+$(wc -l < toto.txt)))
      si la numerotation doit effectivement _commencer_ a 3

      et encore... comme les autres j'ignore les lignes "vides" des exemples que tu proposes :)
  • # Avec Perl

    Posté par  . Évalué à 2.

    Comme l'a dit xavier, il ne serait pas inutile que tu explicites ton exemple : comptes-tu les lignes qui ne contiennent pas "tous" (j'ai supposé que oui) ? que fais-tu des lignes qui contiennent "tous" à un autre endroit (j'ai supposé que tu ne les affiches pas) ? souhaites-tu bien remplacer le premier champ par le numéro (c'est ce que semble montrer ton exemple) ?

    Par rapport à l'exemple fourni,
    perl -nle '/^[^;]*(;tous;.*)$/ and print $. + 12, $1' toto.txt
    fait le boulot et fonctionne pour un cas plus complexe en suivant les suppositions que j'ai faites.

    -n assure le parcours des lignes du (ou des) fichier(s) donnés en arguments (comme awk).
    -l retire les fins de lignes avant le traitement et en remet après.
    $. est le numéro de la ligne courante du fichier.
    $1 est la chaîne correspondant à la première (et dans ce cas unique) parenthèse de l'expression rationnelle.

    « Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.