Как интегрировать многострочный 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 

  • я хочу напечатать строку, которая начинается с словесного слова, а в остальных записях печатается только одно поле
  • Сценарии оболочки, связанные с трубой: прерывание ловушки одного скрипта
  • Параллелизируйте цикл Bash FOR Loop
  • Как напечатать следующий n-й столбец в текущей строке после соответствия шаблону?
  • Почему это назначение переменной не работает при использовании tee?
  • EOF блокирует мой скрипт?
  • Создание сценария оболочки, который анализирует и перенаправляет число в следующую команду?
  • скрипт меню через ssh
  • 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 .

    Linux и Unix - лучшая ОС в мире.