Как запустить grep для одного файла в другом, избегая проблемы нехватки памяти?

Добавление sudo к вашей команде не должно вызывать проблем, если только эта команда изначально не была запрещена. Команда chsh все равно требует пароль. Использование sudo может изменить корневую оболочку, но sudo по-прежнему будет работать как раньше. Если у вас возникли проблемы, я бы закрыл терминал и открыл новый.

2
23.07.2020, 04:14
2 ответа

Если ваш file01.txtне содержит настоящих регулярных выражений , попробуйте:

grep -Ff "file01.txt" "file02.txt" > file03.txt

-Fуказывает grepрассматривать file01.txtкак фиксированные строки, а не регулярные выражения. Это значительно увеличит скорость и значительно снизит требования к памяти.

Регулярные выражения

В качестве альтернативы, если ваш file01.txtдействительно содержит регулярные выражения, вы можете разбить его на части и применить grepк каждой части отдельно:

split -dn 10 "file01.txt"./tmp-file01.
for f in./tmp-file01.*; do grep -f "$f" "file02.txt"; done >file03.txt

Вышеприведенное разделяет file01.txtна 10 частей. В зависимости от доступной памяти вам может понадобиться больше.

Если в файле01.txt нет регулярных выражений, используйте -Fво второй строке:

for f in./tmp-file01.*; do grep -Ff "$f" "file02.txt"; done >file03.txt
4
18.03.2021, 23:17

Вы не можете -паттерн должен быть загружен в grepи эта память исчерпана.

Но если вы хотите сравнить файлы, почему бы вам просто не использоватьdiff(после сортировки содержимого )?

Для одной -строки шаблона (как список MD5):

while read md5; do
    grep -w "$md5" file02.txt
done < file01.txt > file03.txt

Это, конечно, намного медленнее, особенно с большим файлом file02.txt (, когда он не помещается в кеш ), но работает для любого размера шаблона file01.txt.

2
18.03.2021, 23:17

Теги

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