Verwenden Sie keine einfache Befehlsersetzung, um Dateinamen abzurufen (dies kann leicht zu Leerzeichen und anderen Sonderzeichen führen). Verwenden Sie etwas wie xargs
:
xargs -d '\n' -a list_of_files.txt cat > all_compounds.sdf
Oder eine while read
Schleife:
while IFS= read -r file; do cat "$file"; done < list_of_files.txt > all_compounds.sdf
Um die Befehlsersetzung sicher zu verwenden, stellen Sie mindestens IFS
nur die Zeilenumbrüche ein und deaktivieren Sie das Globbing (Platzhaltererweiterung):
(set -f; IFS=$'\n'; cat $(cat list_of_files.txt) > all_compounds.sdf)
Die umgebenden Klammern ()
sollen dies in einer Subshell ausführen, damit Ihre aktuelle Shell von diesen Änderungen nicht betroffen ist.
"$(cat list_of_files.txt)"
cat
wird die gesamte Liste als ein Argument abgerufen .Während GNU
awk
ein Textverarbeitungsprogramm ist, können externe Shell-Befehle über einensystem()
Aufruf ausgeführt werden. Das können wir so zu unserem Vorteil nutzen:Die Idee hier ist einfach: Wir lesen die Datei Zeile für Zeile und erstellen aus jeder Zeile eine formatierte Zeichenfolge
cat "File name.txt"
, die dann an übergeben wirdsystem()
.Und hier ist es in Aktion:
Wir haben dort also schon den größten Teil der Aufgabe erledigt - wir haben alle Dateien auf der Liste gedruckt. Der Rest ist einfach: Leiten Sie die endgültige Ausgabe in die Datei mit dem
>
Operator in die Zusammenfassungsdatei um.quelle