Como integrar um script awk de várias linhas em um script shell

12

Minha pergunta é uma continuação de

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

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

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

  2. converter as codificações de texto em 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 roteiro abaixo. Eu sou capaz de alcançar apenas step 1e step 4, mas nem step 2nem step 3. Gostaria de saber se os 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
Yves
fonte
2
Salvar comandos na variável shell é uma abordagem que leva a muitos problemas.
enzotib 11/08/13
1
O que ele disse, em espadas. mywiki.wooledge.org/BashFAQ/050
tripleee
@Anthon. Como você fez uma boa lista dos comandos? Eu já havia tentado, sem sucesso, e eu tenho o mesmo problema no meu segundo comentário abaixo, apenas pior ....
Yves
@Yves. Linha vazia 1. xxx nova linha / linha vazia 2. ... etc. Mas o mais fácil é clicar em editar mais uma vez e observar a marcação. No canto superior direito, você pode ter um ponto de interrogação laranja, o que explica a formatação (você pode não ter isso dependendo da sua reputação). Você sempre pode cancelar a edição. Nos comentários, no entanto, você tem muito menos recursos de formatação (clique na ajuda abaixo do [Add Comment]botão para ver o que é permitido nos comentários). (Nesse caso, você pode atualizar melhor sua postagem original).
Anthon

Respostas:

15

Você pode armazenar o código passado /usr/bin/awkem uma variável e /usr/bin/awkem uma variável separada da seguinte forma (não testada):

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 eu alterei as aspas duplas para aspas simples. Entre aspas duplas, $ié substituído pelo conteúdo da variável shell i. Entre aspas simples, é um literal $i, que é o que awkespera ver.

Além disso, você não estava escapando das aspas duplas na string, para awknunca ver

$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 $1e $2estava vazio, awkviu

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

Tem certeza de que é necessário armazenar o local do comando? Geralmente, você pode depender da awklocalização em um diretório no caminho do usuário. Se você não usar o caminho completo para awk, não há motivo para parametrizar awk.


fonte
Obrigado. Agora consegui fazer o comando awk funcionar: $ extractcmd $ {sourcefolder} $ {sourcefile} $ {modifier} | $ awk "$ awkcommand"> $ destinationfilepath No entanto, tentar fazer o mesmo com iconv não funciona: iconv = / usr / bin / iconv param = "-f L1 -t UTF-8" $ extractcmd $ {sourcefolder} $ { arquivo de origem} $ {modificador} | $ iconv "$ param" | $ awk "$ awkcommand"> $ destinationfilepath # não funciona, o arquivo de destino está vazio. BTW, a razão pela qual eu usei o caminho completo foi que eu li isso como uma prática recomendada em um tutorial.
Yves