Cómo integrar un script awk multilínea en un script de shell

12

Mi pregunta es una continuación de

Cómo analizar un archivo para extraer números de 3 dígitos guardados en un "número de grupo"

Estoy tratando de integrar en un solo script de shell una serie de comandos que

  1. analizar un estándar europeo para extraer una secuencia de prueba

  2. convertir las codificaciones de texto a utf8

  3. procesar el resultado con la rutina awk que se me proporcionó en la publicación anterior.

  4. guardar el contenido en un archivo de destino

He escrito tentativamente el guión a continuación. Soy capaz de lograr solo step 1y step 4, pero ni step 2tampoco step 3. Me pregunto si se deben crear archivos intermedios (temporales). He tratado de almacenar la salida de los pasos intermedios en variables, pero sin éxito. Cualquier ayuda también sería útil con respecto a posibles errores y la mejor manera de hacerlo.

#!/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
fuente
2
Guardar comandos en la variable de shell es un enfoque que genera muchos problemas.
enzotib
1
Lo que dijo, en espadas. mywiki.wooledge.org/BashFAQ/050
tripleee
@Anthon. ¿Cómo hiciste una buena lista de los comandos? Lo intenté sin éxito y tengo el mismo problema en mi segundo comentario a continuación, solo que peor ...
Yves
@Yves. Línea vacía 1. xxx nueva línea / línea vacía 2. .. etc. Pero lo más fácil es hacer clic en editar una vez más y mirar el marcado. En la parte superior derecha, es posible que tenga un signo de interrogación naranja, que explica el formato (es posible que no tenga eso dependiendo de su reputación) Siempre puede cancelar la edición. Sin embargo, en los comentarios tiene muchas menos capacidades de formato (haga clic en la ayuda debajo del [Add Comment]botón para ver lo que está permitido en los comentarios). (En ese caso, es mejor que actualices tu publicación original).
Anthon

Respuestas:

15

Puede almacenar el código pasado /usr/bin/awken una variable y /usr/bin/awken una variable separada como esta (sin probar):

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"

Tenga en cuenta que cambié las comillas dobles a comillas simples. Entre comillas dobles, $ise sustituye por el contenido de la variable de shell i. Dentro de las comillas simples, es un literal $i, que es lo que awkespera ver.

Además, no escapaba de las comillas dobles dentro de la cadena, por lo que awknunca vio

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

En cambio, vio

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

Si $1y $2estuviera vacío, awkvio

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

¿Estás seguro de que es necesario almacenar la ubicación del comando? Por lo general, puede confiar en buscar awkdentro de un directorio en la ruta de su usuario. Si no usa la ruta completa a awk, no hay razón para parametrizar awk.


fuente
Gracias. Ahora he podido hacer que el comando awk funcione: $ extractcmd $ {sourcefolder} $ {sourcefile} $ {modifier} | $ awk "$ awkcommand"> $ destinationfilepath Sin embargo, intentar hacer lo mismo con iconv no funciona: iconv = / usr / bin / iconv param = "-f L1 -t UTF-8" $ extractcmd $ {sourcefolder} $ { archivo fuente} $ {modificador} | $ iconv "$ param" | $ awk "$ awkcommand"> $ destinationfilepath # no funciona, el archivo de destino está vacío. Por cierto, la razón por la que utilicé la ruta completa fue porque lo leí como una práctica recomendada en un tutorial.
Yves