
Ich versuche, zwei Textzeichenfolgen aus mehreren Datendateien in einem Verzeichnis zu extrahieren. Ich möchte die Textzeichenfolge mit einem ~-Zeichen trennen und die Ausgabe an eine einzelne Datei senden.
Beispielverzeichnisname: /xmldocs
UND die Dateinamen sind Dateinamen: 1.xml
, 2.xml
,3.xml
Erwartete Ausgabe:
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
Das verwendete SCRIPT funktioniert mit nur einem Grep-Befehl
for i in `ls`
do
grep "Document ID:" $i
echo "~"
echo "\n"
done >> /xmldocs/1.txt
Wenn ich den zweiten Grep-Befehl einfüge, grep 'CI[^"]'
bleibt das Skript hängen und es erfolgt keine Ausgabe.
Der aktuelle Ausgang ist
<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
~
Ich bin für jede Hilfe dankbar. Ich bin noch sehr, sehr neu mit LINUX/UNIX-Befehlen und muss die Informationen aus 20.000 XML-Dateien extrahieren. Danke.
Antwort1
Die Idee ist, das Ergebnis von grep zu verarbeiten und es explizit an die Ausgabedatei anzuhängen. Auf diese Weise können Sie die Konsole verwenden, um Debugmeldungen zu schreiben.
#/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'
Wenn dies nicht funktioniert, posten Sie bitte zum Testen die andere Zeile, die Sie greppen möchten.
Antwort2
Was Sie wollen, ist paste
:
#!/bin/bash
for f in *.xml
do
paste -d '~' <(grep 'Document ID:' "$f") <(grep 'CI[\^"]' "$f")
done > /xmldocs/1.txt
Antwort3
Was den Grund dafür angeht, warum das Skript bei Ihrer Verwendung von hängen bleiben kann grep 'CI[^"]'
, sollten Sie ^ maskieren. Die Verwendung von grep 'CI[\^"]'
hat das Problem für mich behoben. Dies liegt daran, dass das Karottensymbol, selbst innerhalb von Klammern, als Negation interpretiert wird.
EDIT: Korrektur von Steeldriver