Зацикливание путей к файлам в ваших файлах con и ref довольно легко в bash.
Что касается того, что «вывод должен содержать имя переменной con_vs_ref_1.txt», вы не очень хорошо объяснили, что вы хотите, но я предполагаю, что вы хотите, чтобы созданный файл был назван в соответствии с этой формулой и внутри выходной каталог. Что-то вроде /home/POP_xpclr/Results/A_vs_C_1.txt
.
#!/usr/bin/env bash
XPCLR="/home/Tools/XPCLR/bin/XPCLR"
CON="/home/POP_xpclr/con"
REF="/home/POP_xpclr/ref"
MAPS="/home/POP_xpclr/1"
OUTDIR="/home/POP_xpclr/Results"
for FILE1 in $(cat $CON)
do
for FILE2 in $(cat $REF)
do
OUTFILE="$OUTDIR/$(basename ${FILE1%.txt})_vs_$(basename ${FILE2%.txt})_1.txt"
$XPCLR -xpclr $FILE1 $FILE2 $MAPS $OUTFILE -w1 0.5 200 1000000 $MAPS -p1 0.95
done
done
Что это делает ...
$(cat $CON)
создает подоболочку и запускает cat
для чтения вашего файла CON, вставляя вывод (т.е. все пути к файлам) в сценарий в этот момент
for FILE1 in $(cat $CON)
создает цикл, в котором все значения, считанные из вашего файла CON, повторяются и присваиваются переменной FILE1 по одному.
for FILE2 in $(cat $REF)
как указано выше, но с файлом REF.
${FILE1%.txt}
вставляет значение переменной FILE1 с расширением ".txt", удаленным с конца. Это называется расширение параметра .
$(basename ${FILE1%.txt})
делает подоболочку, как и раньше, basename
удаляет путь всех ведущих каталогов и возвращает только имя файла, которое мы уже удалили из расширения ".txt" с расширением параметра.
OUTFILE="$OUTDIR/$(basename ${FILE1%.txt})_vs_$(basename ${FILE2%.txt})_1.txt"
объединяет две вышеуказанные точки для создания нового пути к файлу на основе вашей формулы.
do
и done
являются частями конструкции цикла for, которые, я надеюсь, довольно понятны.