Como integrar um script awk de múltiplas linhas em um script de shell

11

Eu sou um iniciante em scripts de shell e minha pergunta é uma continuação de

Como analisar um arquivo para extrair 3 números de dígitos mantidos em um" número de grupo "

Estou tentando integrar em um único script de shell uma série de comandos que

  1. analisa um padrão europeu para extrair uma sequência de teste

  2. converta as codificações de texto para utf8

  3. processe o resultado com a rotina awk que me foi fornecida na postagem acima.

  4. salve o conteúdo em um arquivo de destino

Eu tentei escrever o script abaixo. Eu sou capaz de alcançar apenas step 1 e step 4 , mas nem step 2 nem step 3 . Gostaria de saber se arquivos intermediários (temporários) devem ser criados. Eu tentei armazenar a saída de etapas intermediárias em variáveis, mas sem sucesso. Qualquer ajuda também seria útil em relação a possíveis erros e a melhor maneira de fazer isso.

#!/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
    
por Yves 11.08.2013 / 10:59

1 resposta

13

Você pode armazenar o código passado para /usr/bin/awk em uma variável e /usr/bin/awk em uma variável separada como assim (não testado):

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"

Observe que alterei as aspas duplas para aspas simples. Entre aspas duplas, $i é substituído pelo conteúdo do shell variável i . Entre aspas simples, é um literal $i , que é o que awk espera ver.

Além disso, você não estava escapando das aspas duplas dentro da string. awk nunca viu

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

Em vez disso, viu

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

Se $1 e $2 estiverem vazios, awk viu

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

Tem certeza de que armazenar o local do comando é necessário? Você geralmente pode depender em encontrar awk dentro de um diretório no caminho do usuário. Se você não usar o caminho completo para awk , não há razão para parametrizar awk .

    
por 11.08.2013 / 15:54