Найти значение из массива в одном файле, найти значение в другом файле, а затем использовать это значение, чтобы найти другое и установить в качестве переменной

[не совсем ответ; в комментариях ничего форматировать нельзя]

Обратите внимание, что в ненайденных файлах начальные 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ужасно, но суть вопроса не в этом, верно? И если это не какая-то простая ошибка пользователя, ошибка остается ошибкой, независимо от того, образцовый код или нет.

1
31.07.2019, 01:45
2 ответа

Файл размером 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
1
27.01.2020, 23:22

Просто для разнообразия вот решение, использующее в основном 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      
2
27.01.2020, 23:22

Теги

Похожие вопросы