Forum Programmation.shell awk print $mavariable

Posté par  . Licence CC By‑SA.
Étiquettes :
0
18
juin
2015

Bonjour à tous,

je ne trouve pas de solution pour mettre en paramètre la commande que il se doit.
Contexte dans le répertoir /tmp nous avons des fichiers du type
XXX.TTTT.DAYLY
XXX.TTTT.WEEKLY
XXX.TTTT.MOUNTHLY
Le but et de recopier l'ensemble des fichier en remplaçant la chaîne TTTT par YYYY nous aurons comme résultat:
XXX.YYYY.DAYLY
XXX.YYYY.WEEKLY
XXX.YYYY.MOUNTHLY

A=`ls /tmp/XXX.TTTT* | cut -d. f3`
n=`ls XXX.TTTT.* | wc -l`

awk 
#mais nous ne connaissons pas le nombre
#avec la commande echo $A | awk '{print $2}' sa fonctionne
#il me retourne le résultat WEEKLY et $1 DAYLY etc
awk "/$pattern/ "'{ nmatches++ }END { print nmatches, "found" }' /tmp/data

sa ne fonctionne pas
Nous avons l'erreur suivante
awk "/$A/ "'{ nmatches++ } END { print nmatches, "found" }' /tmp/data
awk: cmd. line:1: /DAY
awk: cmd. line:1: ^ unterminated regexp
awk: cmd. line:2: WEEKLY/ { nmatches++ } END { print nmatches, "found" }
awk: cmd. line:2: ^ syntax error

  • # Si j’ai bien compris

    Posté par  . Évalué à 2.

    Tu veux copier le fichier XXX.TTTT.DAYLY en XXX.YYYY.DAYLY ?
    Si c’est la cas en shell :

    for file in XXX.TTTT.*
    do
      new_name=$(echo $file | sed 's=TTTT=YYYY=')
      cp $file $new_name
    done
    • [^] # Re: Si j’ai bien compris

      Posté par  . Évalué à 2.

      On peut même se passer d'une variable $new_name intermédiaire et de l'appel à sed :

      for file in XXX.TTTT.*; do cp -p "$file" "${file/TTTT/YYYY}"; done
  • # simple quote avant et après la variable shell

    Posté par  . Évalué à 4.

    $ mavariable="abc"
    $ echo $mavariable
    abc
    $ awk 'BEGIN {print "'$mavariable'"}' /dev/null
    abc

    Dans ton cas ça donnerait un truc du genre :

    $ cat<<...|\
    awk '/'$mavariable'/ { nmatches++ } END  { print nmatches, "found" }'
    toto
    titi
    tata
    abc
    fff
    desabc                                                                                                                         ...
    2 found

    Note que ce qui t'intéresse ici est awk '/'$mavariable'/ { nmatches++ } END { print nmatches, "found" }'

    Le reste nest là que pour pouvoir donner "à manger" à awk.

  • # A contient plusieurs lignes

    Posté par  . Évalué à 1.

    Explication des erreurs que tu rencontres…

    Le remplacement de :

    awk "/$A/ "'{ nmatches++ } END { print nmatches, "found" }' /tmp/data

    Donne dans ton cas :

    awk '/DAY
    WEEKLY/ { nmatches++ } END { print nmatches, "found" }' /tmp/data

    Car A contient la chaîne "DAY\nWEEKLY" (le \n désignant un retour à la ligne).

  • # Ne pas utiliser awk ?

    Posté par  . Évalué à 3. Dernière modification le 19 juin 2015 à 14:30.

    Ce ne serait pas plus simple d’utiliser la substitution de variable ?

    moi@PC /tmp
    $ ls
    XXX.TTTT.DAYLY  XXX.TTTT.MONTHLY  XXX.TTTT.WEAKLY
    
    moi@PC /tmp
    $ for f in *; do echo ${f/TTTT/YYYY}; done
    XXX.YYYY.DAYLY
    XXX.YYYY.MONTHLY
    XXX.YYYY.WEAKLY

    C’est possible que j’aie rien compris aussi :)

    Au passage je pense que c’est « monthly » et pas « mounthly »

Suivre le flux des commentaires

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