
디렉터리의 여러 데이터 파일에서 두 개의 텍스트 문자열을 추출하려고 합니다. ~ 문자를 사용하여 텍스트 문자열을 구분하고 출력을 하나의 단일 파일로 보내고 싶습니다.
예제 디렉터리 이름: /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[\^"]'
문제가 해결되었습니다. 이는 당근 기호가 괄호 안에 있어도 부정으로 해석되기 때문입니다.
편집: 스틸드라이버의 수정