Ich möchte den Befehl für jedes Dateipaar im Verzeichnis ausführen und ein Ergebnis in eine Datei schreiben. Ich möchte eine Matrix NxN der Ergebnisse erhalten. Ich habe angefangen:
for file1 in some_directory/*.txt;
do
filename1=$(basename "$file1")
for file2 in some_directory/*.txt;
do
//here python script should be run
python script.py file1 file2
//and result should be written to file, seperate by space
done
//here should be new line
done
Leider kenne ich Bash nicht. Kann mir jemand helfen, es fertigzustellen? Vielen Dank im Voraus
Antwort1
Probieren Sie Folgendes aus:
#!/bin/bash --
(cd some_directory ;\
for file1 in *.txt ; do
for file2 in *.txt ; do
# here python script should be run
printf "%s " "$(python /path/to/script.py "${file1}" "${file2}")"
done
printf "\n"
done ) > result.file
Notiz: /path/to/script.py
muss durch den vollständigen Pfadnamen des Skripts ersetzt werden script.py
.
Der gesamte Block ist in eingeschlossen (...)
. Alle darin enthaltenen Befehle werden in einer Subshell ausgeführt. Dies wird verwendet, um die Ausgabe zu gruppieren und zu erfassen und alle Befehle in auszuführen some_directory
, dank der ersten Zeile mit cd
dem Befehl.
"${file1}"
und "${file2}"
werden verwendet, um die Werte dieser Variablen sicher zu referenzieren.
"$( ... )"
führt den Befehl darin aus und gruppiert die Ausgabe dank der Anführungszeichen in einer einzigen Zeichenfolge.
printf "%s " "$( ... )"
druckt das Ergebnis des python
Skripts mit einem zusätzlichen Leerzeichen.
printf "\n"
druckt eine neue Zeile.
> result.file
leitet die gesamte Ausgabe, die mit allen Befehlen innerhalb der Subshell generiert wird, in die Datei result.file
im aktuellen Verzeichnis um.
Es wurde mit ungewöhnlichen Dateinamen getestet und scheint sicher zu sein.