쉘 스크립트에 여러 줄 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

@ 안톤. 멋진 명령 목록을 어떻게 만들었습니까? 나는 성공적으로 시도하지 않았고, 아래의 두 번째 의견에서 같은 문제가 있습니다. 더 나쁜 것은 ....
Yves

@ 이브 스 빈 줄 1. xxx newline / empty line 2. .. 그러나 가장 쉬운 방법은 편집을 다시 한 번 클릭하고 마크 업을 보는 것입니다. 오른쪽 상단에 주황색 물음표가 표시 될 수 있으며 형식에 대한 설명이 있습니다 (평판에 따라 다를 수 있음) 언제든지 편집을 취소 할 수 있습니다. 그러나 주석에서는 서식 기능이 훨씬 적습니다 (단추 아래의 도움말을 클릭하면 [Add Comment]주석에서 허용되는 것을 볼 수 있습니다). 이 경우 원래 게시물을 업데이트하는 것이 좋습니다.
Anthon

답변:


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} $ {modifier} | $ awk "$ awkcommand"> $ destinationfilepath 그러나 iconv로 동일한 작업을 수행해도 작동하지 않습니다. iconv = / usr / bin / iconv param = "-f L1 -t UTF-8"$ extractioncmd $ {sourcefolder} $ { sourcefile} $ {modifier} | $ iconv "$ param"| $ awk "$ awkcommand"> $ destinationfilepath #가 작동하지 않습니다. 대상 파일이 비어 있습니다. BTW, 내가 전체 경로를 사용한 이유는 튜토리얼에서 이것을 권장 사례로 읽었 기 때문입니다.
Yves
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.