Я хотел бы выполнить команду для каждой пары файлов в каталоге и записать результат в файл, я хотел бы получить матрицу NxN результатов. Я начал:
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
К сожалению, я не знаю bash. Может кто-нибудь помочь мне его закончить? Спасибо заранее
решение1
Попробуйте это:
#!/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
примечание: /path/to/script.py
необходимо заменить на полный путь к script.py
скрипту.
Весь блок заключен в (...)
. Все команды внутри выполняются в подоболочке. Это используется для группировки и захвата их вывода, а также для выполнения всех команд в some_directory
, благодаря первой строке с cd
командой.
"${file1}"
и "${file2}"
используются для безопасного обращения к значениям этих переменных.
"$( ... )"
выполняет команду внутри и группирует вывод в одну строку благодаря двойным кавычкам.
printf "%s " "$( ... )"
выводит результат выполнения python
скрипта с дополнительным пробелом.
printf "\n"
печатает новую строку.
> result.file
перенаправляет весь вывод, сгенерированный всеми командами внутри подоболочки, в указанный файл result.file
в текущем каталоге.
Он был протестирован со странными именами файлов и кажется безопасным.