
Предположим, что у меня есть два набора файлов foo_A_uid.bar
и foo_B_uid.bar
. Каждый набор содержит (известное) количество файлов. Теперь я хочу обработать соответствующие пары с помощью некоторого инструмента ( ImageMagick
в моем случае), то есть я хочу запустить some_command foo_A_i.bar foo_B_i.bar out_i.bar
, где out_i.bar
результат/выход при запуске инструмента на паре foo_A_i.bar
и foo_B_i.bar
для некоторого фиксированного i
.
Мой вопрос в том, как я могу пакетировать этот процесс? Какой-то python
скрипт bash
?
Пояснение:Под набором файлов я подразумеваю список файлов, все начинаются с одного и того же начального, затем идут некоторые UID и имеют одинаковое расширение. Это справедливо как для входных наборов, так и для выходных.
решение1
Вот возможное решение, которое работает, хотя я не знаю, хорошее ли оно.
#!/bin/bash
EXPECTED_ARGS=3
E_BADARGS=65
if [ $# -ne $EXPECTED_ARGS ]
then
echo Not the right number of arguments
exit $E_BADARGS
fi
for i in $( ls $1* ); do
TMP=$(echo $2$(echo $i | cut -d'_' -f2))
TMP2=$(echo $3$(echo $i | cut -d'_' -f2))
convert $i $TMP +append $TMP2
done
Запуск должен выглядеть примерно так:
script foo_A_ foo_B_ out_
решение2
#!/bin/bash
count=$(wc -l foo_A_uid.bar)
for line in $(seq 1 ${count/ */})
do
aline=$(sed -n $line"p" foo_A_uid.bar)
bline=$(sed -n $line"p" foo_A_uid.bar)
yourcommand "$aline" "$bline"
done
Предполагая, что оба файла отсортированы, count-line возвращает количество строк в файле a. Затем цикл проходит по всем значениям от 1 до count. Переменная count содержит имя файла, которое обрезается с помощью ${count/ */}
. С помощью sed вы получаете одну и ту же строку из обоих файлов. -n означает «не печатать по умолчанию», $line"p" тогда просто напечатает строку $line.