UNIX: Zusammenführen von Dateien mit unterschiedlichen Erweiterungen zu einer Datei

UNIX: Zusammenführen von Dateien mit unterschiedlichen Erweiterungen zu einer Datei

Beispiel: In meinem /temp-Verzeichnis habe ich 100 Dateien, 50 mit der Erweiterung .msg und 50 mit .xml.

/temp/test1.xml
/temp/test2.xml
/temp/test3.xml
.........
/temp/test49.xml
/temp/test50.xml

Und

/temp/test1.msg
/temp/test2.msg
/temp/test3.msg
.........
/temp/test49.msg
/temp/test50.msg

In einer Textdatei möchte ich eine Kombination der Inhalte der .xml- und .msg-Dateien nacheinander ausgeben. Die Ausgabedatei soll beispielsweise so aussehen:

content of test1.xml
content of test1.msg
content of test2.xml
content of test2.msg
content of test3.xml
content of test3.msg
............
content of test49.xml
content of test49.msg
content of test50.xml
content of test50.msg

in diesem /temp-Verzeichnis wird es immer eine gleiche Anzahl von .msg- und .xml-Dateien geben. Wird es zusätzlich möglich sein, den Pfad oder den Dateinamen vor dem Inhalt in der Ausgabedatei anzuzeigen? Beispiel:

text1.xml: content of test1.xml 
text1.msg: content of test1.msg
text2.xml: content of test2.xml
text2.msg: content of test2.msg
text3.xml: content of test3.xml
text3.msg: content of test3.msg
....................
text49.xml: content of test49.xml
text49.msg: content of test49.msg
text50.xml: content of test50.xml
text50.msg: content of test50.msg

Ich habe versucht, eine einfache Pipe zu Datei

cat * > text.txt

Dies führt jedoch nicht zum gewünschten Ergebnis. In der Ausgabedatei wird zuerst der Inhalt aller *.xml-Dateien und dann der *.msg-Dateien aufgelistet.

Bitte helfen.

Antwort1

for f in *xml ; do
  cat "$f" "${f/.xml/.msg}"
done > OUTPUTFILE

Könnte für Sie funktionieren, wenn Sie die Shell verwenden bash. Andernfalls (andere POSIX-Shells) verwenden Sie: cat "$f" "${f%.xml}.msg"anstelle der obigen catZeile.

Antwort2

In solchen Situationen ist es oft sinnvoll, wie folgt vorzugehen:

  1. Listen Sie alle Dateien in einer Textdatei auf:

    $ ls > files
    
  2. Bearbeiten Sie die Textdatei, um unerwünschte Dateien zu entfernen und die verbleibenden Dateien in der gewünschten Reihenfolge anzuordnen.

  3. Führen Sie dann einfach Folgendes aus (vorausgesetzt, der Name der Dateien enthält keine Leerzeichen oder Sonderzeichen):

    $ cat $(cat files) > bigfile
    

Eine Variante dieses Ansatzes besteht darin, die Textdatei in einen großen Befehl umzuwandeln.

file1
file2
file with spaces 3
...
filen

Zu:

cat \
file1 \
file2 \
"file with spaces 3" \
... \
filen \
> bigfile

Dann stellen Sie die Datei einfach als Skript bereit:

$ . ./files

viMit können zu jeder Zeile im Puffer ein Leerzeichen und ein Backslash hinzugefügt werden :%s/$/ \\/.

Antwort3

for i in {1..50}; do
    echo "text$i.xml: `cat text$i.xml`" >> output.txt
    echo "text$i.msg: `cat text$i.msg`" >> output.txt
done

Antwort4

Wenn es eine normale Sequenz ist, können Sie Folgendes tun:

in bash:

for ITER in {1..50}
do
    cat test${ITER}.xml
    cat test${ITER}.msg
done > test.txt

oder wenn Sie das Dienstprogrammseq

for ITER in $(seq 1 50)
do
    cat test${ITER}.xml
    cat test${ITER}.msg
done > test.txt

verwandte Informationen