Script para extrair texto usando grep

0

Eu estou tentando extrair duas seqüências de texto de vários arquivos de dados em um diretório. Eu quero separar a string de texto usando um caractere ~ e enviar a saída para um único arquivo.

Exemplo nome do diretório: /xmldocs E os nomes dos arquivos são nome dos arquivos: 1.xml , 2.xml , 3.xml

Resultado esperado:

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 usou o tipo de trabalho com apenas um comando grep

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

Quando eu insiro o comando 2nd grep; grep 'CI[^"]' o script trava e não há saída.

Saída atual é

<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
~

Qualquer ajuda é apreciativa. Eu sou muito novo com comandos LINUX / UNIX e preciso extrair as informações de 20.000 arquivos xml. Obrigado.

    
por Kays Kay 10.07.2015 / 01:52

3 respostas

1

A idéia é processar o resultado do grep e anexá-lo explicitamente ao arquivo de saída. Dessa forma, você pode usar o console para gravar mensagens de depuração.

#/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'

Se isso não funcionar, por favor poste a outra linha que você quer que o grep teste.

    
por bistoco 10.07.2015 / 02:28
0

O que você quer é paste :

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

Em relação a porque o script pode estar pendurado com o uso de grep 'CI[^"]' , você deve estar escapando ^. Usar grep 'CI[\^"]' corrigiu o problema para mim. Isso ocorre porque o símbolo da cenoura, mesmo dentro do escopo dos parênteses, é interpretado como negação.

EDIT: Correção do Steeldriver

    
por aJetHorn 10.07.2015 / 02:35