Для рисования петли из нескольких файлов

Отказоустойчивость — это фраза, которую следует использовать при поиске; мой поиск показал OpenZFS имеет криптографическую контрольную сумму блочного уровня -для точного поиска поврежденных данных, BtrFS контрольные суммы данных и метаданных (crc32c )и Microsoft ReFS с контрольной суммой метаданных.

Замена жестких дисков более надежными твердотельными накопителями — еще одна хорошая идея.

Объедините те, что с зеркалированием дисков (абсолютно простая версия RAID, RAID -1 ), моментальные снимки (, поддерживаемые всеми тремя ), и настоящий онлайн (без переключения )Резервная батарея с плавающей запятой, и у вас будут в основном решены физические проблемы в локальных помещениях, и вы можете перейти к созданию как минимум трех резервных копий всего, что вы не хотите потерять, по крайней мере двух из них нет.

0
10.05.2021, 12:36
2 ответа

Вам нужно загрузить 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.

0
28.07.2021, 11:33

Вы можете использовать команду 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
1
28.07.2021, 11:33

Теги

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