
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