Отказоустойчивость — это фраза, которую следует использовать при поиске; мой поиск показал OpenZFS имеет криптографическую контрольную сумму блочного уровня -для точного поиска поврежденных данных, BtrFS контрольные суммы данных и метаданных (crc32c )и Microsoft ReFS с контрольной суммой метаданных.
Замена жестких дисков более надежными твердотельными накопителями — еще одна хорошая идея.
Объедините те, что с зеркалированием дисков (абсолютно простая версия RAID, RAID -1 ), моментальные снимки (, поддерживаемые всеми тремя ), и настоящий онлайн (без переключения )Резервная батарея с плавающей запятой, и у вас будут в основном решены физические проблемы в локальных помещениях, и вы можете перейти к созданию как минимум трех резервных копий всего, что вы не хотите потерять, по крайней мере двух из них нет.
Вам нужно загрузить 3 файла в 3 отдельных массива, а затем выполнить итерацию по ним один раз . Также было бы неплохо проверить, что массивы имеют одинаковую длину.
bash
имеет встроенную -функцию с именем mapfile
для чтения текстовых файлов в массив. Хотя существуют варианты изменения поведения по умолчанию mapfile
, по умолчанию каждая строка входного файла загружается в элемент массива. Также по умолчанию maparray
использует 0 в качестве источника массива, но вы можете переопределить это с помощью опции -O
(, например. -O 1
чтобы начать массив с 1 вместо 0 ).
Запустите help mapfile
в bash или найдите информацию о файле карты на справочной странице bash.
Например:
#!/bin/bash
# load the three files into arrays a, b, and c.
mapfile -t -O 1 a < fna
mapfile -t -O 1 b < fna2
mapfile -t -O 1 c < fna.prefix
# check if they're the same length
if [ "${#a[@]}" != "${#b[@]}" ] || [ "${#a[@]}" != "${#c[@]}" ]; then
echo "input files are not the same length"
exit 1
fi
# do something with them, iterating from 1 to the length of array a.
for i in $(seq 1 "${#a[@]}"); do
rename.sh -Xmx20g in=",${a[i]}," out=",${b[i]}" prefix=",${c[i]}"
done
Обратите внимание, :если эти 3 файла огромны, миллионы или миллиарды строк каждый, это потребует недопустимого объема памяти. Лучше использовать язык, который позволяет легко открывать 3 файла одновременно и читать по одной строке из каждого файла для каждой итерации цикла. например. awk, perl, python, C и т. д. Даже R.
Вы можете использовать команду paste
. Для файлов:
.txt
1
2
3
b.txt
a
b
c
c.txt
z
x
y
Пример вывода команды::
$ paste -d, a.txt b.txt c.txt
1,x,a
2,y,b
3,z,c
Затем вы можете передать его (с правильным разделителем, который вы используете в команде paste
):
paste -d, a.txt b.txt c.txt | while IFS=',' read -r f1 f2 f3; do
# do your task with $f1 $f2 $3
done