Як інтегрувати багаторядковий скрипт awk в сценарій оболонки


12

Моє запитання - це продовження

Як розібрати файл для вилучення 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

2
Збереження команд до змінної оболонки - це підхід, що призводить до багатьох проблем.
enzotib

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 працювати: $ extractioncmd $ {sourcefolder} $ {sourcefile} $ {модифікатор} | $ awk "$ awkcommand"> $ призначенняfilepath Однак спроба зробити те ж саме, що і iconv не працює: iconv = / usr / bin / iconv param = "-f L1 -t UTF-8" $ extractioncmd $ {sourcefolder} $ { sourcefile} $ {модифікатор} | $ iconv "$ param" | $ awk "$ awkcommand"> $ призначення не працює, цільовий файл порожній. До речі, я використовував повний шлях в тому, що я читав це як рекомендовану практику в навчальному посібнику.
Ів
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.