วิธีรวมสคริปต์หลายบรรทัด 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

@Yves บรรทัดว่าง 1. xxx บรรทัดใหม่ / บรรทัดว่าง 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, มีเหตุผลที่จะ awkparameterize


ขอบคุณ ตอนนี้ฉันสามารถทำให้คำสั่ง awk ทำงานได้แล้ว: $ extractioncmd $ {sourcefolder} $ {sourcefile} $ {modifier} | $ awk "$ awkcommand"> $ destinationfilepath อย่างไรก็ตามการพยายามทำ wiht iconv เดียวกันไม่ทำงาน: iconv = / usr / bin / iconv param = "-f L1 -t UTF-8" $ extractcmd $ {sourcefolder} $ {sourcefolder} $ { sourcefile} $ {modifier} | $ iconv "$ param" | $ awk "$ awkcommand"> $ destinationfilepath # ไม่ทำงานไฟล์เป้าหมายจะว่างเปล่า BTW เหตุผลที่ฉันใช้เส้นทางแบบเต็มคือฉันได้อ่านสิ่งนี้เป็นแนวทางปฏิบัติที่แนะนำในการกวดวิชา
Yves
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.