Script para extraer texto usando grep

Script para extraer texto usando grep

Estoy intentando extraer dos cadenas de texto de varios archivos de datos en un directorio. Quiero separar la cadena de texto usando un carácter ~ y enviar el resultado a un solo archivo.

Ejemplo de nombre de directorio: /xmldocs Y los nombres de archivos son nombres de archivos: 1.xml, 2.xml,3.xml

Rendimiento 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 usado funciona con un solo comando grep

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

Cuando inserto el segundo comando grep; grep 'CI[^"]' el script se bloquea y no hay resultados.

La salida actual es

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

Cualquier ayuda es agradecida. Soy muy nuevo con los comandos de LINUX/UNIX y necesito extraer la información de 20.000 archivos xml. Gracias.

Respuesta1

La idea es procesar el resultado de grep y agregarlo explícitamente al archivo de salida. De esta manera puede usar la consola para escribir mensajes de depuración.

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

Si esto no funciona, publique la otra línea que desea registrar para probarlo.

Respuesta2

Lo que quieres es paste:

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

Respuesta3

En cuanto a por qué el script puede no funcionar con el uso de grep 'CI[^"]', deberías escapar de ^. El uso grep 'CI[\^"]'me solucionó el problema. Esto se debe a que el símbolo de la zanahoria, incluso dentro del alcance de los corchetes, se interpreta como una negación.

EDITAR: corrección de Steeldriver

información relacionada