Cách tích hợp tập lệnh awk multiline trong tập lệnh shell


12

Câu hỏi của tôi là tiếp tục

Cách phân tích tệp để trích xuất 3 chữ số được giữ trong một "số nhóm"

Tôi đang cố gắng tích hợp trong một tập lệnh shell duy nhất một loạt các lệnh

  1. phân tích một tiêu chuẩn châu Âu để trích xuất một chuỗi thử nghiệm

  2. chuyển đổi mã hóa văn bản thành utf8

  3. xử lý kết quả với thói quen awk được cung cấp cho tôi trên bài viết ở trên.

  4. lưu nội dung trong một tệp đích

Tôi đã dự kiến ​​viết kịch bản dưới đây. Tôi chỉ có thể đạt được step 1step 4, nhưng step 2cũng không step 3. Tôi tự hỏi nếu (các) tập tin trung gian (tạm thời) nên được tạo ra. Tôi đã cố gắng lưu trữ đầu ra của các bước trung gian thành các biến, nhưng không thành công. Bất kỳ trợ giúp cũng sẽ được giúp đỡ về những sai lầm có thể và cách tốt nhất để làm điều này.

#!/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
Lưu lệnh vào biến shell là một cách tiếp cận dẫn đến nhiều rắc rối.
enzotib

1
Những gì anh nói, trong thuổng. mywiki.wooledge.org/BashFAQ/050
tripleee

@Anthon. Làm thế nào bạn tạo ra một danh sách tốt đẹp của các lệnh? Tôi đã thử không thành công và tôi gặp vấn đề tương tự trong bình luận thứ hai của mình bên dưới, tệ hơn nữa ....
Yves

@Yves. Dòng trống 1. xxx dòng mới / dòng trống 2. .. vv Nhưng cách dễ nhất là nhấp vào chỉnh sửa một lần nữa và xem phần đánh dấu. Ở phía trên bên phải, bạn có thể có một dấu hỏi màu cam, giải thích về định dạng (bạn có thể không có tùy thuộc vào danh tiếng của mình) Bạn luôn có thể hủy chỉnh sửa. Tuy nhiên, trong các bình luận, bạn có khả năng định dạng ít hơn nhiều (nhấp vào trợ giúp dưới [Add Comment]nút để xem những gì được phép trong các bình luận). (Trong trường hợp đó bạn có thể tốt hơn để cập nhật bài viết gốc của mình).
Anthon

Câu trả lời:


15

Bạn có thể lưu trữ mã được truyền vào /usr/bin/awktrong một biến và /usr/bin/awktrong một biến riêng biệt như vậy (chưa được kiểm tra):

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

Sử dụng:

$awk "$awkcommand"

Lưu ý rằng tôi đã thay đổi dấu ngoặc kép thành dấu ngoặc kép đơn. Trong dấu ngoặc kép, $iđược thay thế bằng nội dung của biến shell i. Trong dấu ngoặc đơn, đó là một nghĩa đen $i, đó là những gì awkmong đợi để xem.

Ngoài ra, bạn không thoát khỏi dấu ngoặc kép trong chuỗi nên awkkhông bao giờ thấy

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

Thay vào đó, nó thấy

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

Nếu $1$2trống, awkđã thấy

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

Bạn có chắc chắn lưu trữ vị trí lệnh là cần thiết? Bạn thường có thể phụ thuộc vào việc tìm awktrong thư mục trong đường dẫn của người dùng. Nếu bạn không sử dụng đường dẫn đầy đủ đến awk, không có lý do để tham số hóa awk.


Cảm ơn. Bây giờ tôi đã có thể làm cho lệnh awk hoạt động: $ extractcmd $ {sourcefolder} $ {sourcefile} $ {modifier} | $ awk "$ awkcommand"> $ Destinationfilepath Tuy nhiên, việc cố gắng thực hiện cùng một biểu tượng wiht không hoạt động: iconv = / usr / bin / iconv param = "-f L1 -t UTF-8" $ extractcmd $ {sourcefolder} $ { mã nguồn} $ {sửa đổi} | $ iconv "$ param" | $ awk "$ awkcommand"> $ Destinationfilepath # không hoạt động, tệp mục tiêu trống. BTW, lý do tôi sử dụng đường dẫn đầy đủ là tôi đọc nó như là một thực hành được đề xuất trong một hướng dẫn.
Yves
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.