#sed #awk #grep
#sed #awk #grep
Вопрос:
file1 = 95000
file2 = 4500000
Я хочу отфильтровать записи file1 из file2.
egrep -f file1 file2
для завершения требуется время.
Есть ли альтернатива? sed? awk?
Спасибо
Ответ №1:
конечно, вы можете использовать awk
. Помещает file2
записи в массив. Затем выполните итерацию file1
, каждый раз находя эти записи в массиве.
awk 'FNR==NR{a[$0];next}($0 in a)' file2 file1
Поиграйте с этими параметрами, чтобы получить то, что вы хотите
awk 'FNR==NR{a[$0];next}(!($0 in a))' file2 file1
awk 'FNR==NR{a[$0];next}(!($0 in a))' file1 file2
awk 'FNR==NR{a[$0];next}($0 in a)' file1 file2
Комментарии:
1. Будет ли это отфильтровывать file1 из file2? Как egrep -vf file1 file2 ?
Ответ №2:
Я не думаю, grep -f
что он действительно предназначен для работы с файлом фильтра такого размера, поэтому лучшим выбором может быть какое-то решение с поддержкой базы данных.
Вы могли бы загрузить оба файла построчно в базу данных SQLite, а затем выполнить простую часть SQL примерно так:
SELECT line FROM file2
EXCEPT
SELECT line FROM file1
и выгрузите их обратно. Вы могли бы сделать все это прямо из командной строки с помощью SQLite.