Egrep ведет себя странно с опцией -f - PullRequest
1 голос
/ 06 марта 2009

У меня странно действует egrep -f.

Пример:

$ egrep -f ~/tmp/tmpgrep2 orig_20_L_A_20090228.txt | wc -l
3
$ for lines in `cat ~/tmp/tmpgrep2` ; do  egrep $lines orig_20_L_A_20090228.txt ; done | wc -l
12

Может ли кто-нибудь дать мне подсказку, в чем может быть проблема? Нет, файлы не менялись между исполнениями. Ожидаемый ответ для числа строк egrep - 12.

ОБНОВЛЕНИЕ содержимого файла: искомый файл содержит около 13000 строк, каждая из которых имеет длину 500 символов, файл шаблона содержит 12 строк, каждая из которых содержит 24 символа Шаблон всегда (и только) встречается в фиксированной позиции в файле с данными (26-49).

ОБНОВЛЕНИЕ содержимого шаблона: каждый шаблон из tmpgrep2 представляет собой число длиной 24 символа.

Ответы [ 5 ]

2 голосов
/ 06 марта 2009

Если шаблоны поиска находятся в тех же строках, то вы можете получить результат, который видите:

Предположим, вы ищете:

abc
def
ghi
jkl

и файл данных:

abcdefghijklmnoprstuvwxzy

, тогда одноразовая команда напечатает 1, а цикл напечатает 4.

1 голос
/ 06 марта 2009

Есть ли у вас дубликаты в ~ / tmp / tmpgrep2? Egrep будет использовать dups только один раз, но ваш цикл будет использовать каждый случай.

Избавьтесь от обманщиков, сделав что-то вроде этого:

$ for lines in `sort < ~/tmp/tmpgrep2 | uniq` ; do  egrep $lines orig_20_L_A_20090228.txt ; done | wc -l
1 голос
/ 06 марта 2009

Может ли быть, что прочитанные строки содержат что-то, что расширяет / заменяет оболочка для вас, во второй версии? Тогда это не выполняется grep при чтении самих шаблонов, что приводит к другому совпадению отправляемых шаблонов.

Я не совсем уверен, выполняет ли оболочка какое-либо расширение значения переменной при таком вызове, но это, по крайней мере, идея.

РЕДАКТИРОВАТЬ: Нет, похоже, не делает никаких замен. Но это может быть проблемой цитирования, если ваши шаблоны содержат пробелы, цикл for будет проходить через каждый токен, а не через каждую строку. Взгляните на <a href="http://www.vias.org/linux-knowhow/bbg_sect_08_02_01.html" rel="nofollow noreferrer">read</a> встроенный bash.

0 голосов
/ 07 марта 2009

Остальные уже придумали большинство вещей, на которые я бы посмотрел. Следующее, что я хотел бы проверить, - это переменная окружения GREP_OPTIONS, или как она называется на вашей машине. Я получил самые странные сообщения об ошибках или поведения при использовании аргумента командной строки, который мешает настройкам среды.

0 голосов
/ 06 марта 2009

Я второй @ раскручиваюсь.

Почему бы вам не запустить без wc -l и посмотреть, что находит каждый поиск?

А может быть:

for lines in `cat ~/tmp/tmpgrep2` ; do echo $lines ; done

Просто чтобы увидеть, что теперь оболочка обрабатывает $lines?

...