Come integrare uno script awk multilinea in uno script shell


12

La mia domanda è una continuazione di

Come analizzare un file per estrarre numeri di 3 cifre conservati in un "numero di gruppo"

Sto cercando di integrare in una singola shell script una serie di comandi che

  1. analizzare uno standard europeo per estrarre una sequenza di test

  2. converti le codifiche di testo in utf8

  3. elaborare il risultato con la routine awk che mi è stata fornita sul post sopra.

  4. salva il contenuto in un file di destinazione

Ho provvisoriamente scritto la sceneggiatura qui sotto. Sono in grado di ottenere solo step 1e step 4, ma né step 2step 3. Mi chiedo se dovrebbero essere creati file intermedi (temporanei). Ho provato a memorizzare l'output di passaggi intermedi in variabili, ma senza successo. Qualsiasi aiuto sarebbe utile per quanto riguarda possibili errori e il modo migliore per farlo.

#!/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

2
Il salvataggio dei comandi nella variabile shell è un approccio che porta a molti problemi.
enzotib,

1
Quello che ha detto, a picche. mywiki.wooledge.org/BashFAQ/050
tripleee

@Anthon. Come hai fatto una bella lista dei comandi? Avevo provato senza successo e ho lo stesso problema nel mio secondo commento qui sotto, solo peggio ....
Yves,

@Yves. Riga vuota 1. xxx newline / riga vuota 2. .. ecc. Ma il modo più semplice è fare clic su Modifica ancora una volta e guardare il mark-up. In alto a destra potresti avere un punto interrogativo arancione, che spiega sulla formattazione (potresti non averlo a seconda della tua reputazione) Puoi sempre annullare la modifica. Nei commenti tuttavia hai capacità di formattazione molto inferiori (fai clic sulla guida sotto il [Add Comment]pulsante per vedere cosa è consentito nei commenti). (In tal caso potresti essere meglio di aggiornare il tuo post originale).
Anthon,

Risposte:


15

È possibile memorizzare il codice passato a /usr/bin/awkin una variabile e /usr/bin/awkin una variabile separata in questo modo (non testato):

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

Uso:

$awk "$awkcommand"

Si noti che ho cambiato le virgolette doppie in virgolette singole. Tra virgolette doppie, $iviene sostituito dal contenuto della variabile shell i. Tra virgolette singole, è un valore letterale $i, che è ciò che si awkaspetta di vedere.

Inoltre, non stavi sfuggendo alle doppie virgolette all'interno della stringa, quindi awknon l' hai mai visto

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

Invece, vide

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

Se $1e $2fosse vuoto, awkvisto

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

Sei sicuro che sia necessario memorizzare la posizione del comando? Di solito puoi dipendere dalla ricerca awkall'interno di una directory nel percorso del tuo utente. Se non si utilizza il percorso completo per awk, non c'è motivo di parametrizzare awk.


Grazie. Ora sono stato in grado di far funzionare il comando awk: $ extractcmd $ {sourcefolder} $ {sourcefile} $ {modificatore} | $ awk "$ awkcommand"> $ destinationfilepath Tuttavia, provare a fare lo stesso con iconv non funziona: iconv = / usr / bin / iconv param = "-f L1 -t UTF-8" $ extractcmd $ {sourcefolder} $ { file sorgente} $ {modificatore} | $ iconv "$ param" | $ awk "$ awkcommand"> $ destinationfilepath # non funziona, il file di destinazione è vuoto. A proposito, il motivo per cui ho usato il percorso completo è che ho letto questo come una pratica consigliata in un tutorial.
Yves,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.