Comment intégrer un script awk multiligne dans un script shell

12

Ma question est une continuation de

Comment analyser un fichier pour extraire des nombres à 3 chiffres conservés dans un "numéro de groupe"

J'essaie d'intégrer dans un script shell unique une série de commandes qui

  1. analyser une norme européenne pour extraire une séquence de test

  2. convertir les encodages de texte en utf8

  3. traiter le résultat avec la routine awk qui m'a été fournie dans le post ci-dessus.

  4. enregistrer le contenu dans un fichier de destination

J'ai provisoirement écrit le script ci-dessous. Je suis capable de réaliser seulement step 1et step 4, mais ni step 2ni step 3. Je me demande si des fichiers intermédiaires (temporaires) doivent être créés. J'ai essayé de stocker la sortie des étapes intermédiaires dans des variables, mais sans succès. Toute aide serait également utile en ce qui concerne les erreurs possibles et la meilleure façon de le faire.

#!/bin/bash
# creating the Latex code for a test procedure

awkcommand= "/usr/bin/awk
 '
    $1 == "Group" {printf("\\section{%s %d}\n", $1, $2); next}
    {
      title = sep = ""
      for (i=1; i<=NF; i++) 
        if ($i ~ /^[0-9][0-9][0-9]$/) {
          printf("\\subsection{%s} \n\\TestDetails{%d}\n", title, $i)
          break
        }
        else {
          title = title sep $i
          sep = FS
        }
    }
' 
"

sourcefolder="/Users/yves/Desktop/Test-folder-parsing/"
sourcefile="NFEN3545-001.pdf"
destfile="Latex-code.tex"
destfolder=$sourcefolder
destinationfilepath=${destfolder}${destfile}
extractioncmd="/usr/local/bin/pdftotext -layout -f 54 -l 54"
modifier=" -"
#textencodingcmd="/usr/bin/iconv -f L1 -t UTF-8" # Needed but not used

${extractioncmd}  ${sourcefolder}${sourcefile} ${modifier}  >  $destinationfilepath
exit 0
Yves
la source
2
L'enregistrement de commandes dans une variable shell est une approche qui entraîne de nombreux problèmes.
enzotib
1
Ce qu'il a dit, à la pelle. mywiki.wooledge.org/BashFAQ/050
tripleee
@Anthon. Comment avez-vous fait une belle liste des commandes? J'avais essayé sans succès, et j'ai le même problème dans mon deuxième commentaire ci-dessous, juste pire ....
Yves
@Yves. Ligne vide 1. xxx newline / ligne vide 2. .. etc. Mais le plus simple est de cliquer à nouveau sur edit et de regarder le balisage. En haut à droite, vous pourriez avoir un point d'interrogation orange, ce qui explique le formatage (vous pourriez ne pas l'avoir en fonction de votre réputation) Vous pouvez toujours annuler la modification. Dans les commentaires, cependant, vous avez beaucoup moins de capacités de formatage (cliquez sur l'aide sous le [Add Comment]bouton pour voir ce qui est autorisé dans les commentaires). (Dans ce cas, vous feriez mieux de mettre à jour votre message d'origine).
Anthon

Réponses:

15

Vous pouvez stocker le code transmis /usr/bin/awkdans une variable et /usr/bin/awkdans une variable distincte comme ceci (non testé):

awk=/usr/bin/awk

awkcommand='
$1 == "Group" {printf("\section{%s %d}\n", $1, $2); next}
{
title = sep = ""
for (i=1; i<=NF; i++) 
  if ($i ~ /^[0-9][0-9][0-9]$/) {
    printf("\subsection{%s} \n\TestDetails{%d}\n", title, $i)
    break
  }
  else {
    title = title sep $i
    sep = FS
  }
}
'

Usage:

$awk "$awkcommand"

Notez que j'ai changé les guillemets doubles en guillemets simples. Entre guillemets doubles, $iest remplacé par le contenu de la variable shell i. Entre guillemets simples, il s'agit d'un littéral $i, ce que l'on awkattend de voir.

De plus, vous n'échappiez pas aux guillemets doubles dans la chaîne, donc vous n'avez awkjamais vu

$1 == "Group" {printf("\section{%s %d}\n", $1, $2); next}

Au lieu de cela, il a vu

<contents of shell $1> == Group {printf(\section{%s %d}\n, <contents of shell $1>, <contents of shell $2>); next}

Si $1et $2étaient vides, awkvu

 == Group {printf(\section{%s %d}\n, , ); next}

Êtes-vous sûr que le stockage de l'emplacement de la commande est nécessaire? Vous pouvez généralement dépendre de la recherche awkdans un répertoire du chemin de votre utilisateur. Si vous n'utilisez pas le chemin complet vers awk, il n'y a aucune raison de paramétrer awk.


la source
Merci. J'ai maintenant pu faire fonctionner la commande awk: $ extractioncmd $ {sourcefolder} $ {sourcefile} $ {modifier} | $ awk "$ awkcommand"> $ destinationfilepath Cependant, essayer de faire la même chose avec iconv ne fonctionne pas: iconv = / usr / bin / iconv param = "-f L1 -t UTF-8" $ extractioncmd $ {sourcefolder} $ { fichier source} $ {modifier} | $ iconv "$ param" | $ awk "$ awkcommand"> $ destinationfilepath # ne fonctionne pas, le fichier cible est vide. BTW, la raison pour laquelle j'ai utilisé le chemin complet était que je lis ceci comme une pratique recommandée dans un tutoriel.
Yves