grep большой список с большим файлом

На самом деле максимальный размер памяти в 32-битных системах может варьироваться, составляя до 4 ГБ, но 2 ГБ является общим значением. Часто можно перенастроить ядро, чтобы увеличить его до 3 или 3,5 ГБ. Проблема, конечно же, в том, что у вас просто нет адресного пространства, чтобы отображать больше памяти. Вы пробовали 64-битную машину?

Также не забудьте установить свой ulimit выше, прежде чем вы это сделаете.

23
задан codeforester 30 March 2017 в 05:35
поделиться

2 ответа

Попробуйте

grep -f the_ids.txt huge.csv

Кроме того, поскольку ваши шаблоны кажутся фиксированными строками, использование опции -F может ускорить grep.

   -F, --fixed-strings
          Interpret PATTERN as a  list  of  fixed  strings,  separated  by
          newlines,  any  of  which is to be matched.  (-F is specified by
          POSIX.)
30
ответ дан devnull 30 March 2017 в 05:35
поделиться

grep -f filter.txt data.txt становится неуправляемым, когда filter.txt превышает пару тысяч строк и, следовательно, не является лучшим выбором для такой ситуации. Даже при использовании grep -f нам нужно помнить несколько вещей:

  • использовать опцию -x, если необходимо сопоставить всю строку во втором файле
  • используйте -F, если в первом файле есть строки, а не шаблоны
  • используйте -w для предотвращения частичных совпадений, не используя опцию -x

обсуждение этой темы (grep -f для больших файлов):

И этот пост рассказывает о grep -vf:


В итоге лучший способ обработки grep -f для больших файлов:

Соответствие всей строке:

awk 'FNR==NR {hash[[110]]; next} [110] in hash' filter.txt data.txt > matching.txt

Соответствие определенному полю во втором файле (с использованием разделителя ',' и поле 2 в этом примере):

awk -F, 'FNR==NR {hash[$1]; next} $2 in hash' filter.txt data.txt > matching.txt

и для grep -vf:

Соответствует всей строке:

awk 'FNR==NR {hash[[112]]; next} !([112] in hash)' filter.txt data.txt > not_matching.txt

Соответствует a конкретное поле в второй файл (используя разделитель ',' и поле 2 в этом примере):

awk -F, 'FNR==NR {hash[[113]]; next} !($2 in hash)' filter.txt data.txt > not_matching.txt
4
ответ дан codeforester 30 March 2017 в 05:35
поделиться