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

12

Мой вопрос является продолжением

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

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

  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
Ив
источник
2
Сохранение команд в переменную оболочки является подходом, приводящим ко многим неприятностям.
энзотиб
1
То, что он сказал, в пики. mywiki.wooledge.org/BashFAQ/050
tripleee
@Anthon. Как вы составили хороший список команд? Я попытался безуспешно, и у меня та же проблема во втором комментарии ниже, только хуже ...
Ив
@Yves. Пустая строка 1. xxx новая строка / пустая строка 2. ... и т. Д. Но проще всего нажать еще раз на правку и посмотреть на разметку. В верхнем правом углу у вас может быть оранжевый вопросительный знак, который объясняет форматирование (у вас может не быть этого в зависимости от вашей репутации). Вы всегда можете отменить редактирование. В комментариях, однако, у вас гораздо меньше возможностей форматирования (нажмите на кнопку справки под [Add Comment]кнопкой, чтобы увидеть, что разрешено в комментариях). (В этом случае вам лучше обновить исходный пост).
Энтон

Ответы:

15

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

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.


источник
Благодарю. Теперь я могу заставить команду awk работать: $ extractcmd $ {sourcefolder} $ {sourcefile} $ {modifier} | $ awk "$ awkcommand"> $ destinationfilepath Однако попытка сделать то же самое с iconv не работает: iconv = / usr / bin / iconv param = "-f L1 -t UTF-8" $ extractcmd $ {sourcefolder} $ { исходный файл} $ {модификатор} | $ iconv "$ param" | $ awk "$ awkcommand"> $ destinationfilepath # не работает, целевой файл пуст. Кстати, причина, по которой я использовал полный путь, заключалась в том, что я прочитал это в качестве рекомендуемой практики в учебнике.
Ив