[не совсем ответ; в комментариях ничего форматировать нельзя]
Обратите внимание, что в ненайденных файлах начальные 6, 7 или 8 символов из /mnt/zbig
обрезаны:
/mnt/zbig/media/Movies/Edición/@video-remux/8 El hijo de Randal.mp4 [ok]
...
big/media/Movies/Edición/@video-remux/19 La cueva de las flores.mp4 [error]
...
g/media/Movies/Edición/@video-remux/21 La fiesta de la Luna.mp4 [error]
Я сильно подозреваю, что в bash
есть ошибка с многобайтовой кодировкой/локалью; попробуйте запустить свой скрипт с помощью LC_ALL=C your_script.sh
и посмотрите, есть ли разница. Поскольку ошибка не связана с ffmpeg
или другими вещами, а только с read
, вы, вероятно, можете сократить свой тестовый пример до
find. -type f -name "*.mp4"... | while read -r f; do
ls "$f"
done > /dev/null
Также укажите (в своем вопросе )ваш дистрибутив и bash
версию.
Конечно, использовать find | read -r
ужасно, но суть вопроса не в этом, верно? И если это не какая-то простая ошибка пользователя, ошибка остается ошибкой, независимо от того, образцовый код или нет.
Файл размером 100x100 невелик, поэтому он не нуждается в какой-либо специальной обработке. Я представлял себе создание разных выходных файлов для каждого столбца, а затем использование вставки для их объединения, но с таким маленьким файлом в этом нет необходимости, достаточно просто сохранить значения в массивах :
.$ cat tst.awk
BEGIN { OFS = "\t" }
NR==FNR {
key2mult[$1] = $NF
next
}
FNR==1 {
for (colNr=1; colNr<=NF; colNr++) {
colNr2mult[colNr] = key2mult[$colNr]
printf "%s%s", $colNr, (colNr<NF ? OFS : ORS)
}
next
}
{
for (colNr=1; colNr<=NF; colNr++) {
vals[FNR,colNr] = $colNr
}
}
END {
for (rowNr=2; rowNr<=FNR; rowNr++) {
for (colNr=1; colNr<=NF; colNr++) {
printf "%.05f%s", vals[rowNr,colNr] * colNr2mult[colNr], (colNr<NF ? OFS : ORS)
}
}
}
.
$ awk -f tst.awk file2 file1
RR1.out RR2.out
16.57416 21.01053
20.11905 25.49240
18.64490 23.63410
Вышеописанное было выполнено на этом входе:
$ tail -n +1 file1 file2
==> file1 <==
RR1.out RR2.out
45.7597 45.7646
55.5468 55.5269
51.4768 51.4792
==> file2 <==
file Gibbs weighted
RR2.out -1752.142111 0.4591
RR1.out -1752.141887 0.3622
RR4.out -1752.140564 0.0894
Использование нового ввода сэмпла:
$ awk -f tst.awk file2 file1
RR1.out RR2.out RR3.out RR4.out RR5.out RR6.out
16.57416 21.01053 3.13118 4.06277 0.47016 0.45178
20.11905 25.49240 3.81561 4.94917 0.57655 0.55459
18.64490 23.63410 3.56182 4.62173 0.53573 0.51525
19.91560 25.24853 3.78686 4.91421 0.57144 0.54958
16.46050 20.87174 3.18052 4.12741 0.47934 0.46049
$ awk -f tst.awk file2 file1 | column -s$'\t' -t
RR1.out RR2.out RR3.out RR4.out RR5.out RR6.out
16.57416 21.01053 3.13118 4.06277 0.47016 0.45178
20.11905 25.49240 3.81561 4.94917 0.57655 0.55459
18.64490 23.63410 3.56182 4.62173 0.53573 0.51525
19.91560 25.24853 3.78686 4.91421 0.57144 0.54958
16.46050 20.87174 3.18052 4.12741 0.47934 0.46049
Просто для разнообразия вот решение, использующее в основном bash
и bc
для плавающей арифметики.
#!/usr/bin/env bash
# r is an associative array of weights, indexed by column name
declare -A r
source <(awk '{ print "r[\"" $1 "\"]=" $6}' <( tail +2 file2))
hdr=
while read line
do
if ! [ $hdr ]
then
hdr=($line)
set -- $line
for h do
printf '%-12s ' "$h"
done
printf '\n'
else
set -- $line
for h in ${hdr[@]}
do
coef=${r[$h]}
printf '%-11.5f ' \
$(bc <<< "scale=6; $1 * $coef")
shift
done
printf '\n'
fi
done < file1
Образец вывода 6x5:
RR1.out RR2.out RR3.out RR4.out RR5.out RR6.out
16.57416 21.01053 3.13118 4.06277 0.47016 0.45179
20.11905 25.49240 3.81561 4.94917 0.57655 0.55459
18.64490 23.63410 3.56182 4.62173 0.53573 0.51524
19.91560 25.24852 3.78686 4.91421 0.57144 0.54958
16.46050 20.87174 3.18052 4.12741 0.47934 0.46049