Я пытаюсь очистить огромную базу данных электронных писем, но когда я использую следующую команду Grep, я получаю сообщение об ошибке "Память исчерпана".

pv "Suppresion-List.txt" | grep -vf <(sed 's/^/^/; s/$/$/' EMAILS.txt) > RESULT.txt

Набор данных в обоих файлах действительно огромен, например, более 5 миллионов электронных писем, поэтому сервер Linux выдает ошибку "Память исчерпана".

Поэтому я решил разделить файл на маленькие файлы с 10 000 электронных писем для обработки.

split -d -l 10000 EMAILS.txt Segment

Как создать Bash Script с циклом, где он проверяет созданный разделенный файл в порядке возрастания и начинает обработку с первого созданного файла - например, Segment00

pv "Suppresion-List.txt" | grep -vf <(sed 's/^/^/; s/$/$/' Segment00) > RESULT.txt

... затем автоматически зациклите ту же команду и замените файл второго сегмента в команде - например, Segment01

pv "Suppresion-List.txt" | grep -vf <(sed 's/^/^/; s/$/$/' Segment01) > RESULT.txt

... нести цикл до последнего сегмента, а затем окончательно завершить.

Не могли бы вы помочь мне написать такой скрипт на Bash? Я не могу понять, как автоматически подставлять сегментированные файлы в порядке возрастания автоматически в цикле для написания сценария оболочки.

Пожалуйста помоги.

1 ответ1

1

Вы можете использовать, например, for цикла, как это:

for i in Segment??
do
pv "Suppresion-List.txt" | grep -vf <(sed 's/^/^/; s/$/$/' "$i") >> RESULT.txt
done

Будет выполнена команда со всеми файлами Segment<symbol><symbol> и ДОБАВЛЕНИЕ результата в RESULT.txt

На основании комментария команда должна быть:

pv "RESULT-1.txt" | grep -vf <(sed 's/^/^/; s/$/$/' "$i") >> RESULT.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .