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>

"Widget Name ="(Search String) 다음에 다음 단어 (example1)를 인쇄하고 단어 (Example1)의 복제본을 찾아 그 옆에 개수를 인쇄하고 싶습니다. 출력 결과는 다음과 같아야합니다.

   example_1_new 2

누군가 내가 이것을하는 방법을 알려 줄 수 있습니까? configure.txt에는 위와 같이 약 1000 줄의 데이터가 있습니다. 방금 예를 들었습니다.


그래서 내 솔루션은 더 이상 하나가 아닙니다. cigwin 을 설치 한 경우 awkunix 를 사용하여 빠른 스타일 프로그램을 수행 할 수 있습니다. 여기에 아주 좋은 참고, 단계적으로는 다음과 같습니다 grymoire.com/Unix/Awk.html
J. Chomel

나는 다음에 awk를 시도 할 것이고, 위에서 언급 한 작업을 위해 일괄 처리해야합니다. 배치 스크립팅에 능숙한 경우 위의 제안을 알려주십시오. @Chomel
S6633d

미안 해요 행운을 빕니다!
J. Chomel

내 업데이트 된 스크립트는 그러나 작동 데이터의 철자 바꾸기와 같은 오타가있다 : 예는 오전 전 대 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"등이 있습니다. _가 위 코드 출력에 영향을 미치나요? @josefZ
S6633d

명확성을 위해 입력 내용을 다시 편집했습니다. 확인하십시오.
S6633d 2016 년

나는 다음과 같은 출력을 얻고있다 : example_1_new example_3_new example_4_old
S6633d

중복 된 위젯 이름과 텍스트 파일에서 발생한 횟수를 나타내는 카운트를 인쇄하면됩니다. 이것 좀 도와주세요. 미리 감사드립니다
S6633d 2016 년

좋아 .. 잘 작동합니다. :) 스크립트에서 이해하지 못하는 몇 가지, @Josefz
S6633d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.