Самый быстрый и эффективный способ удаления строк, содержащих строки (строки, перечисленные в другом текстовом файле)

Мне было интересно, является ли fgrep самым быстрым и эффективным способом удаления строк из файла (file1), который содержит строку, найденную в другом файле (файл2).

Я нашел функцию fgrep, которая должна сделать это следующим образом:

fgrep -v -f file1 file2 > file_with_lines_containing_search_strings_removed 

Я не знаю, будет ли это работать с очень большими файлами.

У меня есть два файла со 100 000 строк, и я хочу использовать самый быстрый способ.

Благодарю.

С 4 июля все эти забавные американцы.

Да, все будет хорошо. В худшем случае, когда файл со строками для исключения равен размеру обрабатываемого файла и размер, который не вписывается в память. Если у вас есть этот случай, разделите файл исключения на куски и выполните несколько проходов.

Если вы хотите «строки, содержащие строку, найденную в другом файле» (а не «строки, содержащие строку, которая соответствует regExp в другом файле»), попробуйте:

 grep -vFf file1 file2 > file3 

«grep -F» не ищет соответствия регулярному выражению, но простое совпадение строк ( намного быстрее )

или даже лучше

 grep -vwFf file1 file2 #respect word boundary 

Просто быстрое сравнение времени:

1) построить пример 1002 случайных строк file2

 seq 1000000 | shuf -n 100000 > file2 

2) построить 10 000 случайных строк пример file1 (строки для удаления)

  seq 1000000 | shuf -n 10000 > file1 

31) Использование grep -Ftime grep -vwFf file1 file2 > file31

 real 0m0.111s user 0m0.100s sys 0m0.008s 

32) Без -Ftime grep -vwf file1 file2 > file32

… часов!

 if file1 has just 300 lines -- 0.327s very fast .... 600 lines -- 8.326s .... 900 lines -- 35.334s .... 1200 lines -- 1m31.433s (quadratic with file1 len?) .... 10000 lines -- it is still calculating (several hours?) UPDATED 1h03m53.983s 

Заключение теста:

  • grep -vFf file1 file2 намного быстрее, чем grep -vf

  • grep -vFf file1 file2 не имеет проблем с большими файлами file1

  • grep -vf file1 file2 злобно влияет на увеличение размера файла file1 (это видно только для размеров> 500 строк или> 4kbytes)