Cara mengintegrasikan skrip awk multiline dalam skrip shell


12

Pertanyaan saya adalah kelanjutan dari

Cara mem-parsing file untuk mengekstrak 3 digit angka yang disimpan dalam "nomor grup"

Saya mencoba untuk mengintegrasikan dalam satu skrip shell serangkaian perintah itu

  1. parsing standar eropa untuk mengekstrak urutan uji

  2. ubah pengkodean teks menjadi utf8

  3. proseskan hasilnya dengan rutinitas awk yang diberikan kepada saya pada pos di atas.

  4. simpan konten dalam file tujuan

Untuk sementara saya menulis skrip di bawah ini. Saya hanya bisa mencapai step 1dan step 4, tetapi tidak step 2juga step 3. Saya ingin tahu apakah file perantara (sementara) harus dibuat. Saya telah mencoba untuk menyimpan output langkah menengah ke dalam variabel, tetapi tidak berhasil. Setiap bantuan juga akan membantu tentang kemungkinan kesalahan dan cara terbaik untuk melakukan ini.

#!/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
Menyimpan perintah ke variabel shell adalah pendekatan yang mengarah ke banyak masalah.
enzotib

1
Apa yang dia katakan, dalam sekop. mywiki.wooledge.org/BashFAQ/050
tripleee

@Anthon. Bagaimana Anda membuat daftar perintah yang bagus? Saya telah mencoba gagal, dan saya memiliki masalah yang sama dalam komentar kedua saya di bawah ini, hanya lebih buruk ....
Yves

@Yves. Baris kosong 1. xxx baris baru / baris kosong 2. ... dll. Tetapi yang termudah adalah mengklik edit sekali lagi dan lihat mark-up. Di kanan atas Anda mungkin memiliki tanda tanya oranye, yang menjelaskan tentang pemformatan (Anda mungkin tidak memiliki itu tergantung pada reputasi Anda) Anda selalu dapat membatalkan hasil edit. Namun dalam komentar Anda memiliki kemampuan memformat jauh lebih sedikit (klik pada bantuan di bawah [Add Comment]tombol untuk melihat apa yang diizinkan dalam komentar). (Dalam hal ini Anda mungkin lebih baik memperbarui posting asli Anda).
Anthon

Jawaban:


15

Anda dapat menyimpan kode yang diteruskan ke /usr/bin/awkdalam sebuah variabel dan /usr/bin/awkdalam variabel yang terpisah seperti itu (belum diuji):

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

Pemakaian:

$awk "$awkcommand"

Perhatikan bahwa saya mengubah tanda kutip ganda menjadi tanda kutip tunggal. Dalam tanda kutip ganda, $idiganti dengan isi dari variabel shell i. Dalam tanda kutip tunggal, itu adalah literal $i, yang awkdiharapkan untuk dilihat.

Selain itu, Anda tidak keluar dari tanda kutip ganda dalam string sehingga awktidak pernah melihat

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

Sebaliknya, ia melihat

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

Jika $1dan $2kosong, awklihat

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

Anda yakin perlu menyimpan lokasi perintah? Anda biasanya dapat mengandalkan penemuan awkdalam direktori di jalur pengguna Anda. Jika Anda tidak menggunakan path lengkap ke awk, tidak ada alasan untuk membuat parameterawk .


Terima kasih. Saya sekarang dapat membuat perintah awk bekerja: $ ekstraksicmd $ {sourcefolder} $ {sourcefile} $ {modifier} | $ awk "$ awkcommand"> $ destinationfilepath Namun, mencoba melakukan hal yang sama dengan ikonv tidak berfungsi: iconv = / usr / bin / iconv param = "-f L1 -t UTF-8" $ ekstraksicmd $ {sourcefolder} $ { sourcefile} $ {modifier} | $ iconv "$ param" | $ awk "$ awkcommand"> $ destinationfilepath # tidak berfungsi, file target kosong. BTW, alasan saya menggunakan path lengkap adalah bahwa saya membaca ini sebagai latihan yang disarankan dalam tutorial.
Yves
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.