Çok satırlı bir awk betiği kabuk betiğine nasıl entegre edilir


12

Sorum şu

Bir "grup numarası" içinde tutulan 3 basamaklı sayıları ayıklamak için bir dosyayı ayrıştırma

Ben tek bir kabuk komut dosyası komutları bir dizi entegre etmeye çalışıyorum

  1. bir test sekansı çıkarmak için bir avrupa standardını ayrıştırma

  2. metin kodlamalarını utf8'e dönüştür

  3. sonucu yukarıdaki yazıda bana verilen awk rutini ile işleyin.

  4. içeriği bir hedef dosyaya kaydetme

Aşağıdaki senaryoyu geçici olarak yazdım. Sadece başarabildim step 1ve step 4ne step 2de ne step 3. Acaba ara (geçici) dosyaların oluşturulup oluşturulmayacağını merak ediyorum. Ara adımların çıktısını değişkenlere depolamaya çalıştım, ancak başarılı olamadım. Herhangi bir yardım, olası hatalar ve bunu yapmanın en iyi yolu konusunda da yardımcı olacaktır.

#!/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
Kabuk değişkenine komutları kaydetmek birçok soruna yol açan bir yaklaşımdır.
enzotib


@Anthon. Komutların güzel bir listesini nasıl yaptınız? Başarısız bir şekilde denemiştim ve aşağıdaki ikinci yorumda da aynı sorun var, sadece daha kötü ....
Yves

@Yves. Boş satır 1. xxx satırsonu / boş satır 2. .. vb. Ancak en kolayı bir kez daha düzenlemeyi tıklayıp işaretlemeye bakmaktır. Sağ üstte, biçimlendirmeyi açıklayan turuncu bir soru işareti olabilir (itibarınıza bağlı olarak buna sahip olmayabilir) Düzenlemeyi her zaman iptal edebilirsiniz. Ancak yorumlarda çok daha az biçimlendirme özelliği vardır ( [Add Comment]yorumlarda nelere izin verildiğini görmek için düğmenin altındaki yardıma tıklayın ). (Bu durumda orijinal yayınınızı güncellemeniz daha iyi olabilir).
Anthon

Yanıtlar:


15

İletilen kodu /usr/bin/awkbir değişkende ve /usr/bin/awkşu şekilde (denenmemiş) ayrı bir değişkende saklayabilirsiniz :

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

Kullanımı:

$awk "$awkcommand"

Çift tırnak işaretlerini tek tırnak işaretleri olarak değiştirdiğimi unutmayın. Çift tırnak $iiçinde, kabuk değişkeninin içeriği ile değiştirilir i. Tek tırnak işaretleri içinde değişmez bir $ideğişkendir awk.

Ayrıca, dize içindeki çift tırnak işaretlerinden kaçmadınız, bu yüzden awkhiç görmedim

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

Bunun yerine gördü

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

$1Ve $2boş olsaydı , awkgördüm

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

Komut konumunu depolamak gerektiğinden emin misiniz? Genellikle kullanıcı yolunuzdaki awkbir dizinde bulmaya bağlı olabilirsiniz . İçin tam yolu kullanmazsanız awk, parametreleştirmek için bir neden yoktur awk.


Teşekkürler. Şimdi awk komutunu çalıştırabildim: $ extractioncmd $ {sourcefolder} $ {sourcefile} $ {modifier} | $ awk "$ awkcommand"> $ destinationfilepath Ancak, iconv ile aynı işlemi yapmaya çalışmaz: iconv = / usr / bin / iconv param = "-f L1 -t UTF-8" $ extractioncmd $ {sourcefolder} $ { sourcefile} $ {değiştirici} | $ iconv "$ param" | $ awk "$ awkcommand"> $ destinationfilepath # çalışmıyor, hedef dosya boş. BTW, tam yolu kullanmamın nedeni, bunu bir eğitimde önerilen bir uygulama olarak okumaktı.
Yves
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.