Сценарий для извлечения текста с помощью grep

Я пытаюсь извлечь две текстовых строки из нескольких файлов данных в каталоге. Я хочу разделить текстовую строку с помощью ~ символа и отправить вывод в один единственный файл.

Имя каталога в качестве примера: /xmldocs И имена файлов являются названием файлов: 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

СЦЕНАРИЙ использовал вид работ только с одной командой grep

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

Когда я вставляю 2-ю команду 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-файлов.Спасибо.

0
задан 10 July 2015 в 03:14

3 ответа

Идея является процессом результат 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 протестировать его.

1
ответ дан 4 October 2019 в 00:58

То, что вы хотите, это paste:

#!/bin/bash
for f in *.xml
do
    paste -d '~' <(grep 'Document ID:' "$f") <(grep 'CI[\^"]' "$f")
done > /xmldocs/1.txt
0
ответ дан 4 October 2019 в 00:58

Относительно того, почему скрипт может зависать при использовании grep 'CI[^"]', вам следует избегать ^. Использование grep 'CI[\^"]' решило проблему для меня. Это потому, что символ моркови, даже в скобках, интерпретируется как отрицание.

РЕДАКТИРОВАТЬ: коррекция Steeldriver

0
ответ дан 4 October 2019 в 00:58

Другие вопросы по тегам:

Похожие вопросы: