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

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

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

  • BASH: группировка файлов по имени
  • awk каталог файлов
  • Слияние столбцов двух файлов в порядке
  • Удаление нескольких строк в файле
  • Записывает соответствующий шаблон с Awk
  • поиск файла внутри скрипта
  • Я пытаюсь интегрировать в один сценарий оболочки ряд команд, которые

    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?
  • Процесс проверки и уничтожения пользователя перед удалением
  • Сценарий оболочки работает при сохранении с помощью nano, но не при сохранении с помощью Notepad ++
  • Bash, как запустить некоторые фоновые процессы, но ждать других?
  • Сравнение файлов по строкам в awk с разделителем
  • эффективная функция командной строки файла cross-os
  • 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 - лучшая ОС в мире.