Почему я получаю разные ответы из файла grep -oc «foo» и grep -o «foo» file | wc -l? Что из этого правильно?

#linux #bash #grep

#linux #баш #grep

Вопрос:

Этот вопрос действительно все говорит сам за себя… Я пытаюсь найти количество вхождений определенных строк в большой файл.
Ответы похожи …. например, 50 000 или около того с трубой и 49 000 с лишним с простым grep — oc…

Кто-нибудь может объяснить, почему я получаю разные ответы, и какой из них был бы правильным?

Спасибо за помощь.

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

1. Вероятно, большее число, так как другое, вероятно, относится к случаю, когда строка встречается более одного раза в строке… возможно.

2. Есть ошибка в coreutils, чтобы исправить это, хотя я не уверен, что существует консенсус в отношении неправильного текущего поведения: savannah.gnu.org/bugs/?33080 (Я, конечно, думаю, что нынешнее поведение противоречит здравому смыслу).

Ответ №1:

grep -c подсчитывает только совпадающие строки, тогда grep -o как печатает каждую совпадающую часть в отдельной строке, что означает, что wc -l будет напечатано больше «строк», чем на самом деле совпадают.

Насколько я могу видеть, нет никакой эффективной разницы между grep -oc и grep -c потому, что подавление печати означает, что результирующего эффекта -o больше нет.

Например, печать трехстрочного «файла» с одним двойным совпадением и одним одиночным совпадением:

 $ printf 'foo foonbarnfoon' | grep -oc foo
2
$ printf 'foo foonbarnfoon' | grep -o foo
foo
foo
foo
 

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

1. Вау, мне нравится, насколько похожи наши ответы 🙂 Foo Bar ftw 😉

Ответ №2:

В --only-matching -o режиме () grep иногда выводит несколько строк для одной совпадающей строки.

 alex@yuzu:~$ echo -e "foonbarnbaz"
foo
bar
baz

alex@yuzu:~$ echo -e "foonbarnbaz" | grep -o o  
o
o
 

Но с --count помощью ( -c ) он будет подсчитывать количество совпадающих строк.

 alex@yuzu:~$ echo -e "foonbarnbaz" | grep -oc o
1
 

Так grep -o o | wc -l же подсчитываются все совпадения, даже если в одной строке более одного совпадения.

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

1. Я не согласен с тем, что результат -oc «правильный», и, похоже, он, безусловно, не согласен с тем, что хочет OP. Если в строке есть два вхождения, искомый результат равен 2, а не 1.