Повторите совпадения всей строки с помощью grep для нескольких экземпляров на одной строке.

Ответвление от этого вопроса:

При поиске строки "банан" из следующего файла мы бы хотели 1,2,3 и 7 экземпляров строк 1,2,3 и 4 соответственно. Количество выводов grep должно равняться количеству совпадений, при этом возвращая всю строку.

There is one banana here
There are two banana banana here
There are three banana banana banana here
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
In fact we need not have any too!

Примечание: если мы удалим ограничение целых строк в выводе, мы получим:

grep -no "banana" tempfile 

который возвращается

1:banana
2:banana
2:banana
3:banana
3:banana
3:banana
4:banana
4:banana
4:banana
4:banana
4:banana
4:banana
4:banana

Есть идеи?

РЕДАКТИРОВАТЬ: Это предполагаемый вывод

1 There is one banana here
2 There are two banana banana here
2 There are two banana banana here
3 There are three banana banana banana here
3 There are three banana banana banana here
3 There are three banana banana banana here
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have

3 ответа

Решение

grep только счетчик для матчей -c счетчик для строк, у которых есть совпадение, но мы можем использовать awk сделать это. Насколько я понимаю, вы хотите напечатать строку, которая соответствует х количество раз в зависимости от количества совпадений. Ну, вот оно:

$ awk '{for(i=1;i<=NF;i++) if($i=="banana") counter++;for(j=1;j<=counter;j++) print NR,$0;counter=0 }' input.txt         
1 There is one banana here
2 There are two banana banana here
2 There are two banana banana here
3 There are three banana banana banana here
3 There are three banana banana banana here
3 There are three banana banana banana here
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have

Основная идея здесь заключается в том, что мы перебираем каждое слово в строке и подсчитываем совпадения. Если есть совпадение, мы увеличиваем счетчик, а затем используем этот счетчик для печати той же строки в цикле. Наконец счетчик сбрасывается и процесс повторяется

С использованием perl Оператор повторения строки, получающий количество повторений путем оценки результата совпадения в скалярном контексте:

$ perl -pe '$_ x= (() = /banana/g)' file
There is one banana here
There are two banana banana here
There are two banana banana here
There are three banana banana banana here
There are three banana banana banana here
There are three banana banana banana here
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
Basically there is no limit to how many banana banana banana banana banana banana banana we can have

Это не очень красиво, но вы могли бы использовать что-то вроде

awk '{print NR, gsub(/banana/, "")' <tempfile

Это работает с помощью awkgsub команда для замены шаблона соответствия (здесь, банан), и он возвращает количество раз, которое он выполняет замену. Если затем выводит номер строки ввода и количество совпадений

Или повторить строку ввода несколько раз

awk '{A=$0
b=gsub(/banana/, "")
for (i=1; i<=b; i++) print A
}' <tempfile
Другие вопросы по тегам