#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.