एक txt फ़ाइल के माध्यम से खोज और एक स्ट्रिंग के अगले शब्द मुद्रण


2

मेरे पास एक बैच स्क्रिप्ट है जो खोज स्ट्रिंग की पूरी लाइन को टेक्स्ट फाइल में प्रिंट करेगी।

   for %%i in (configure.txt) do (
   FINDSTR /C:"Widget Name=" %%i >> output.txt
   )

यहाँ बताया गया है कि मेरी Configure.txt फाइल कैसी दिखेगी:

   <Widget Name="example_1_new" Type="IFC"/>
   <Property Name="exmaple_2_old"/>
   <Content>
   <Widget Name="example_3_new"/>
   <Widget Name="example_4_old"/>
   <Widget Name="exmaple_1_new"/>
   </Content>

मैं "विजेट नाम =" (खोज स्ट्रिंग) के बाद अगले शब्द (उदाहरण 1) को प्रिंट करना चाहता हूं और शब्द (उदाहरण 1) के डुप्लिकेट को भी ढूंढता हूं और इसके आगे इसकी गिनती प्रिंट करता हूं, ताकि मेरा आउटपुट पसंद हो:

   example_1_new 2

क्या कोई मुझे बता सकता है कि यह कैसे करना है? कृपया ध्यान दें कि config.txt में ऊपर की तरह लगभग 1000 लाइनें हैं। मैंने सिर्फ एक उदाहरण दिया।


तो मेरा समाधान अब एक नहीं है। यदि आपने सिगविन स्थापित किया है , तो आप awkunix का उपयोग करके त्वरित स्टाइल प्रोग्राम कर सकते हैं । यहाँ बहुत अच्छा संदर्भ है, कदम से कदम: grymoire.com/Unix/Awk.html
जे।

मैं अपने अगले एक के लिए जागने की कोशिश करूंगा, मुझे अपने उपरोक्त कार्य के लिए अब बैच में करने की आवश्यकता है। कृपया मुझे ऊपर के लिए अपने सुझाव बताएं कि क्या आप बैच पटकथा @Chomel में अच्छे हैं चलो
S6633d

माफ़ कीजियेगा मैं नहीं हूँ। यहाँ शुभकामनाएँ!
जे। चोमेल

मेरे अद्यतन स्क्रिप्ट लेकिन काम करता है आपके डेटा में एक अनाग्राम की तरह गलती है तो: पूर्व हूँ ple_1 बनाम पूर्व मा ple_1
JosefZ

जवाबों:


2

अगला टिप्पणी कोड स्निपेट को काम करना चाहिए:

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion

rem delete auxiliary variables
for /F %%G in ('set ___ 2^>NUL') do set "%%G=" 

rem count up number of occurrences 
for /F tokens^=2^ delims^=^" %%G in ('
    FINDSTR /C:"Widget Name=" "configure.txt"
  ') do set /A "___%%G+=1"

rem subtract 1 to get number of duplicates
for /F "tokens=1,2 delims==" %%G in ('set ___ 2^>NUL') do set /A "%%G-=1"

REM output: does dot work if your data contains _ underscore
REM for /F "tokens=1,2 delims=_=" %%G in ('set ___ 2^>NUL') do echo %%G %%H

rem alternative output
for /F "tokens=1,2 delims==" %%G in ('set ___ 2^>NUL') do (
  set "_auxvarname=%%G"
  call set "_auxvarname=%%_auxvarname:~3%%"
  SETLOCAL EnableDelayedExpansion
    echo !_auxvarname! %%H
  ENDLOCAL
)

आउटपुट फ़ाइल बनाने के लिए, अंतिम लाइनों को निम्नानुसार बदलें:

rem alternative output
> output.txt (
    for /F "tokens=1,2 delims==" %%G in ('set ___ 2^>NUL') do (
      set "_auxvarname=%%G"
      call set "_auxvarname=%%_auxvarname:~3%%"
      SETLOCAL EnableDelayedExpansion
        echo !_auxvarname! %%H
      ENDLOCAL
    )
)

मूल प्रश्न से और अद्यतन एक से डेटा के साथ आउटपुट :

==> type "configure.txt"
<Widget Name="example1"/>
<Property Name="exmaple2"/>
<Content Name="example3"/>
<Widget Name="example4"/>
<Widget Name="example1"/>
<Widget Name="example_1_new" Type="IFC"/>
<Property Name="exmaple_2_old"/>
<Content>
<Widget Name="example_3_new"/>
<Widget Name="example_4_old"/>
<Widget Name="exmaple_1_new"/>
</Content>

==> D:\bat\SU\1094786.bat
example1 1
example4 0
example_1_new 0
example_3_new 0
example_4_old 0
exmaple_1_new 0

यह सिर्फ सभी विजेट नामों को प्रिंट करता है, भले ही इसे दो बार देखा जाए, यह आउटपुट फ़ाइल में एक बार मुद्रित होता है। मेरे इनपुट फ़ाइल विजेट का नाम "example_1" "example_2" आदि है। क्या _ वैसे भी उपरोक्त कोड आउटपुट को प्रभावित कर रहा है? @ जोज़फ़
S6633d

मैंने आपकी स्पष्टता के लिए मेरे इनपुट को फिर से संपादित किया है .. कृपया इसे जांचें।
S6633d

मुझे इस तरह से आउटपुट मिल रहा है: example_1_new example_3_new example_4_old
S6633d

मुझे केवल डुप्लिकेट किए गए विजेट नामों और गिनती को प्रिंट करने की आवश्यकता है जो कहती हैं कि पाठ फ़ाइल में कितनी बार यह हुआ था। इसमें मेरी मदद करो। अग्रिम धन्यवाद
17:66 पर S6633d

बढ़िया .... अच्छा काम करता है। :) कुछ चीजें जो मैं स्क्रिप्ट में नहीं समझता, क्या आप मुझे कुछ स्पष्टीकरण दे सकते हैं @ जोसेफ
S6633d
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.