So integrieren Sie ein mehrzeiliges awk-Skript in ein Shell-Skript

12

Meine Frage ist eine Fortsetzung von

Analysieren einer Datei zum Extrahieren von 3-stelligen Nummern in einer "Gruppennummer"

Ich versuche, in ein einzelnes Shell-Skript eine Reihe von Befehlen zu integrieren, die

  1. Analysieren Sie eine europäische Norm, um eine Testsequenz zu extrahieren

  2. wandle die Textcodierungen in utf8 um

  3. Verarbeiten Sie das Ergebnis mit der awk-Routine, die Sie mir auf dem obigen Post gegeben haben.

  4. Speichern Sie den Inhalt in einer Zieldatei

Ich habe das folgende Skript vorläufig geschrieben. Ich kann nur step 1und erreichen step 4, aber weder step 2noch step 3. Ich frage mich, ob (temporäre) Zwischendateien erstellt werden sollten. Ich habe versucht, die Ausgabe von Zwischenschritten in Variablen zu speichern, aber ohne Erfolg. Jede Hilfe wäre auch hilfreich in Bezug auf mögliche Fehler und den besten Weg, dies zu tun.

#!/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
quelle
2
Das Speichern von Befehlen in Shell-Variablen ist ein Ansatz, der zu vielen Problemen führt.
Enzotib
1
Was er sagte, in Pik. mywiki.wooledge.org/BashFAQ/050
Tripleee
@Anthon. Wie haben Sie eine schöne Liste der Befehle erstellt? Ich hatte es erfolglos versucht und ich habe das gleiche Problem in meinem zweiten Kommentar unten, nur schlimmer ...
Yves
@ Yves. Leerzeile 1. xxx neue Zeile / Leerzeile 2. .. usw. Am einfachsten ist es jedoch, noch einmal auf Bearbeiten zu klicken und sich die Markierung anzusehen. Oben rechts befindet sich möglicherweise ein orangefarbenes Fragezeichen, das die Formatierung erläutert. (Je nach Ihrem Ruf ist dies möglicherweise nicht der Fall.) Sie können die Bearbeitung jederzeit abbrechen. In Kommentaren haben Sie jedoch weit weniger Formatierungsmöglichkeiten (klicken Sie auf Hilfe unter[Add Comment] Schaltfläche, um zu sehen, was in Kommentaren zulässig ist). (In diesem Fall ist es möglicherweise besser, den ursprünglichen Beitrag zu aktualisieren.)
Anthon

Antworten:

15

Sie können den übergebenen Code /usr/bin/awkin einer Variablen und /usr/bin/awkin einer separaten Variablen wie folgt speichern (ungetestet):

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
  }
}
'

Verwendung:

$awk "$awkcommand"

Beachten Sie, dass ich die doppelten Anführungszeichen in einfache Anführungszeichen geändert habe. Wird in doppelten Anführungszeichen $idurch den Inhalt der Shell-Variablen ersetzt i. Innerhalb von einfachen Anführungszeichen handelt es sich um ein Literal $i, das awkzu sehen ist.

Außerdem haben Sie die doppelten Anführungszeichen in der Zeichenfolge nicht ignoriert, also awknie gesehen

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

Stattdessen sah es

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

Wenn $1und $2waren leer, awksah

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

Sind Sie sicher, dass der Befehlsspeicherort gespeichert werden muss? Sie können sich normalerweise darauf verlassen, dass Sie sich awkin einem Verzeichnis im Pfad Ihres Benutzers befinden. Wenn Sie nicht den vollständigen Pfad zu verwenden awk, gibt es keinen Grund zum Parametrierenawk .


quelle
Vielen Dank. Ich konnte jetzt den Befehl awk zum Laufen bringen: $ extractcmd $ {sourcefolder} $ {sourcefile} $ {modifier} | $ awk "$ awkcommand"> $ destinationfilepath Der Versuch, dasselbe mit iconv zu tun, funktioniert jedoch nicht: iconv = / usr / bin / iconv param = "-f L1 -t UTF-8" $ extractcmd $ {sourcefolder} $ { Quelldatei} $ {Modifikator} | $ iconv "$ param" | $ awk "$ awkcommand"> $ destinationfilepath # funktioniert nicht, die Zieldatei ist leer. Übrigens, der Grund, warum ich den vollständigen Pfad verwendet habe, war, dass ich dies als empfohlene Übung in einem Tutorial gelesen habe.
Yves