grep을 사용하여 텍스트를 추출하는 스크립트

grep을 사용하여 텍스트를 추출하는 스크립트

디렉터리의 여러 데이터 파일에서 두 개의 텍스트 문자열을 추출하려고 합니다. ~ 문자를 사용하여 텍스트 문자열을 구분하고 출력을 하나의 단일 파일로 보내고 싶습니다.

예제 디렉터리 이름: /xmldocs AND 파일 이름은 파일 이름: 1.xml, 2.xml,3.xml

예상 출력:

TEXT_STRING_ONE~TEXT_STRING_TWO   ------- This is from 1.xml
TEXT_STRING_ONE~TEXT_STRING_TWO   ------- This is from 2.xml
TEXT_STRING_ONE~TEXT_STRING_TWO   ------- This is from 3.xml

SCRIPT는 단 하나의 grep 명령으로 작동하는 종류를 사용했습니다.

for i in `ls`
do
grep "Document ID:" $i
echo "~" 
echo "\n"
done >> /xmldocs/1.txt

두 번째 grep 명령을 삽입하면; grep 'CI[^"]' 스크립트가 중단되고 출력이 없습니다.

현재 출력은

<KMS_data id="KMS_documentId" name="Document ID:">12</KMS_data>
~
<KMS_data id="KMS_documentId" name="Document ID:">19</KMS_data>
~
<KMS_data id="KMS_documentId" name="Document ID:">6</KMS_data>
~


grep "Document ID:" $i
~


grep "Document ID:" $i
~


grep "Document ID:" $i > /xmldocs/1.txt
~

어떤 도움이라도 감사하겠습니다. 저는 LINUX/UNIX 명령을 처음 접했고 20,000개의 xml 파일에서 정보를 추출해야 합니다. 감사해요.

답변1

아이디어는 grep의 결과를 처리하고 이를 출력 파일에 명시적으로 추가하는 것입니다. 이렇게 하면 콘솔을 사용하여 디버그 메시지를 작성할 수 있습니다.

#/bin/bash

# Save output to this file
outputFile='./xmldocs/1.txt'
rm -f $outputFile

# List only *.xml files and iterate
for i in `ls *.xml`
do
    # Echo which file is being processed (only printed to console )
    echo 'Processing :'$i
    # Grep, remove trailing newline and append to $outputFile
    grep "Document ID:" -s $i | tr -d '\n'  >> $outputFile
    # Add char to separate
    printf "~" >> $outputFile
    # Grep, remove trailing newline and append to $outputFile
    grep 'CI[^"]' -s $i | tr -d '\n' >> $outputFile
    # Print newline to separate results
    printf "\n" >> $outputFile
done 

echo '!! done'

이것이 작동하지 않으면 테스트하기 위해 grep하려는 다른 줄을 게시하십시오.

답변2

당신이 원하는 것은 paste:

#!/bin/bash
for f in *.xml
do
    paste -d '~' <(grep 'Document ID:' "$f") <(grep 'CI[\^"]' "$f")
done > /xmldocs/1.txt

답변3

을 사용하면 스크립트가 중단되는 이유에 대해서는 grep 'CI[^"]'^를 이스케이프 처리해야 합니다. 사용하면 grep 'CI[\^"]'문제가 해결되었습니다. 이는 당근 기호가 괄호 안에 있어도 부정으로 해석되기 때문입니다.

편집: 스틸드라이버의 수정

관련 정보