Jak zintegrować wielowierszowy skrypt awk ze skryptem powłoki

12

Moje pytanie jest kontynuacją

Jak parsować plik w celu wyodrębnienia 3 cyfr liczb przechowywanych w „numerze grupy”

Próbuję zintegrować w jednym skrypcie powłoki serię poleceń, które

  1. przeanalizować europejski standard, aby wyodrębnić sekwencję testową

  2. przekonwertować kodowanie tekstu na utf8

  3. przetworzę wynik za pomocą procedury awk, która została mi dostarczona w powyższym poście.

  4. zapisz zawartość w pliku docelowym

Wstępnie napisałem poniższy skrypt. Jestem w stanie osiągnąć tylko step 1i step 4, ale ani step 2nie step 3. Zastanawiam się, czy należy utworzyć pliki pośrednie (tymczasowe). Próbowałem zapisać wynik pośrednich kroków w zmiennych, ale bez powodzenia. Każda pomoc byłaby również pomocna w zakresie możliwych błędów i najlepszego sposobu na to.

#!/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
Yves
źródło
2
Zapisywanie poleceń w zmiennej powłoki jest podejściem prowadzącym do wielu problemów.
enzotib
1
To, co powiedział, pikami. mywiki.wooledge.org/BashFAQ/050
tripleee
@Anthon. Jak stworzyłeś ładną listę poleceń? Próbowałem bezskutecznie i mam ten sam problem w moim drugim komentarzu poniżej, po prostu gorzej ....
Yves
@Yves. Pusta linia 1. xxx nowa linia / pusta linia 2. .. itd. Ale najłatwiej jest ponownie kliknąć edytuj i spojrzeć na narzut. W prawym górnym rogu może być pomarańczowy znak zapytania, który wyjaśnia formatowanie (możesz go nie mieć w zależności od swojej reputacji). Zawsze możesz anulować edycję. W komentarzach masz jednak znacznie mniej możliwości formatowania (kliknij pomoc pod [Add Comment]przyciskiem, aby zobaczyć, co jest dozwolone w komentarzach). (W takim przypadku możesz lepiej zaktualizować swój oryginalny post).
Anthon

Odpowiedzi:

15

Możesz przechowywać kod przekazany /usr/bin/awkw zmiennej i /usr/bin/awkosobnej zmiennej, tak jak to (nietestowane):

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

Stosowanie:

$awk "$awkcommand"

Zauważ, że zmieniłem podwójne cudzysłowy na pojedyncze cudzysłowy. W obrębie podwójnych cudzysłowów $izastępuje się zawartością zmiennej powłoki i. W obrębie pojedynczych cudzysłowów jest to dosłowny element $i, który awkoczekuje.

Ponadto nie unikałeś podwójnych cudzysłowów w ciągu, więc awknigdy nie widziałem

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

Zamiast tego zobaczył

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

Jeśli $1i $2były puste, awkzobaczyłem

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

Czy na pewno konieczne jest zapisanie lokalizacji polecenia? Zwykle możesz polegać na znalezieniu się awkw katalogu na ścieżce użytkownika. Jeśli nie użyjesz pełnej ścieżki do awk, nie ma powodu do parametryzacji awk.


źródło
Dzięki. Udało mi się teraz uruchomić polecenie awk: $ extractcmd $ {sourcefolder} $ {sourcefile} $ {modyfikator} | $ awk "$ awkcommand"> $ destinationfilepath Jednak próba zrobienia tego samego z ikonv nie działa: iconv = / usr / bin / iconv param = "-f L1 -t UTF-8" $ ekstrakcjacmd $ {folder źródłowy} $ { plik źródłowy} $ {modyfikator} | $ iconv "$ param" | $ awk "$ awkcommand"> $ destinationfilepath # nie działa, plik docelowy jest pusty. BTW, powodem, dla którego użyłem pełnej ścieżki było to, że przeczytałem to jako zalecaną praktykę w tutorialu.
Yves