शेल स्क्रिप्ट में मल्टीलाइन awk स्क्रिप्ट को कैसे एकीकृत करें


12

मेरा प्रश्न निरंतर है

"समूह संख्या" में रखी गई 3 अंकों की संख्या निकालने के लिए फ़ाइल पार्स कैसे करें

मैं एक एकल शेल स्क्रिप्ट में आदेशों की एक श्रृंखला को एकीकृत करने की कोशिश कर रहा हूं जो

  1. परीक्षण क्रम निकालने के लिए एक यूरोपीय मानक को पार्स करें

  2. टेक्स्ट एनकोडिंग को utf8 में बदलें

  3. परिणाम को जागृत दिनचर्या के साथ संसाधित करें जो मुझे उपरोक्त पोस्ट पर प्रदान किया गया था।

  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। खाली लाइन 1. xxx newline / खाली लाइन 2. .. आदि। लेकिन सबसे आसान है एडिट पर क्लिक करें और एक बार मार्क-अप देखें। शीर्ष-दाईं ओर आपके पास एक नारंगी प्रश्न चिह्न हो सकता है, जो प्रारूपण पर व्याख्या करता है (आपके पास आपकी प्रतिष्ठा के आधार पर ऐसा नहीं हो सकता है) आप हमेशा संपादन को रद्द कर सकते हैं। टिप्पणियों में हालांकि आपके पास बहुत कम प्रारूपण क्षमताएं हैं ( [Add Comment]टिप्पणियों में अनुमति दी गई देखने के लिए बटन के नीचे मदद पर क्लिक करें )। (उस स्थिति में आप अपनी मूल पोस्ट को अपडेट करने के लिए बेहतर हो सकते हैं)।
एंथन

जवाबों:


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 कमांड का काम करने में सक्षम हो गया हूँ: $ निष्कर्षण cmd $ {sourcefolder} $ {sourcefile} $ {modifier} | $ awk "$ awkcommand"> $ डेस्टीफाइलपाथ हालांकि, एक ही wiht आइकॉन को करने की कोशिश नहीं करता है: iconv = / usr / bin / iconv param = "-f L1 -t UTF-8" $ निष्कर्सीएमडी $ {sourcefolder} $ { sourcefile} $ {संशोधक} | $ iconv "$ परम" | $ awk "$ awkcommand"> $ डेस्टिनेलेपथ # काम नहीं करता है, लक्ष्य फ़ाइल खाली है। BTW, कारण मैं पूरा रास्ता इस्तेमाल किया था कि मैं एक ट्यूटोरियल में एक सिफारिश अभ्यास के रूप में यह पढ़ा।
यव्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.