Быстрый способ удаления строк шаблона из файла в оболочке

#linux #performance #shell #unix #grep

#linux #Производительность #оболочка #unix #grep

Вопрос:

У меня есть файл1 с приблизительно 60000 строками и файл2 с приблизительно 20000 строками. Мне нужно удалить строки, присутствующие в file2, из file1. Файл2 также содержит .* для удаления аналогичного шаблона из file1.

файл1:

 ABC DEG
bhdh jdjjd
cdhhd jdjd
ABC hjj
  

file2:

 ABC.*
cdhhd jdjd
  

Вывод должен быть:

 bhdh jdjjd
  

Прямо сейчас я использую приведенный ниже код.

 while read -r line
do
  sed -i "/${line}/d" $file1
done < "$file2" 
  

С этим кодом для получения выходных данных требуется около 30 минут. Мне действительно нужен лучший способ удалить эти строки из file1.

Комментарии:

1. аналогично ответу grep, вы можете использовать rg -vf file2 file1 для еще большей скорости (rg is github.com/BurntSushi/ripgrep )… и if .* — это размер регулярного выражения, которое вы собираетесь использовать, grep -vFf и rg -vFf будет еще быстрее, после удаления .* из file2

Ответ №1:

Это как раз для вашей задачи:

 grep -vf file2 file1
  

-v исключит строки file1, которые соответствуют любому шаблону в file2


Примечание: ваш цикл выполняется очень медленно, потому что вы читаете файл шаблонов построчно с помощью цикла bash и выполняете тысячи sed команд, по одной для каждого шаблона. Смотрите Также здесь еще немного о том, почему это плохая практика.


Примечание: Для замены file1 выводом приведенной выше команды:

 grep -vf file2 file1 > file1.tmp amp;amp; mv file1.tmp file1