Как интегрировать многострочный awk-скрипт в сценарий оболочки

Я новичок в сценариях оболочки, и мой вопрос является продолжением

Как проанализировать файл для извлечения 3 цифр, хранящихся в «групповом номере»,

Я пытаюсь интегрировать в один сценарий оболочки ряд команд, которые

  1. проанализировать европейский стандарт для извлечения тестовой последовательности

  2. конвертировать текстовые кодировки в utf8

  3. обработайте результат с помощью процедуры awk, которая была предоставлена ​​мне в сообщении выше.

  4. сохранить содержимое в целевом файле

Я предварительно написал сценарий ниже. Я могу достичь только step 1 и step 4 , но ни step 2 ни step 3 . Интересно, должен ли быть создан промежуточный (временный) файл (ы). Я попытался сохранить вывод промежуточных шагов в переменные, но безуспешно. Любая помощь также могла бы помочь в возможных ошибках и наилучшем способе сделать это.

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

One Solution collect form web for “Как интегрировать многострочный awk-скрипт в сценарий оболочки”

Вы можете сохранить код, переданный в /usr/bin/awk в переменной, и /usr/bin/awk в отдельной переменной, подобной так (untested):

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

Применение:

 $awk "$awkcommand" 

Обратите внимание, что я сменил двойные кавычки на одинарные кавычки. В двойных кавычках $i заменяется содержимым переменной оболочки i . В одинарных кавычках это буквальный $i , что и ожидает awk .

Кроме того, вы не избежали двойных кавычек в строке, поэтому awk никогда не видел

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

Вместо этого он увидел

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

Если $1 и $2 были пустыми, awk увидел

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

Вы уверены, что нужно сохранить местоположение команды? Обычно вы можете зависеть от нахождения awk в каталоге по пути пользователя. Если вы не используете полный путь к awk , нет причин для параметризации awk .

  • Выберите последний файл, основанный на порядковом номере, указанном в имени файла
  • ftp и shebang
  • Как lsof прикрепить к скрипту PID скрипта?
  • Как разобрать таблицу для шаблона, если шаблон содержит пробелы
  • Как искать определенные разделы файла, а затем извлекать только соответствующую информацию в этом разделе?
  • shell: разделение столбцов с помощью awk-стопов, если найдено не целое число
  • Awk зависает во время математической операции в Solaris
  • Как удалить конечную новую строку в bash?
  • Как суммировать числа внутри многих 2D-массивов
  • Определение разницы в датах в формате «% Y% m% d% H% M% S»
  • Как добавить каталог изменений и git pull к этой линии crontab?
  • команда не найдена в сценарии оболочки
  • Linux и Unix - лучшая ОС в мире.