Повторите целые соответствия строки с 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
1
задан 13 April 2017 в 15:23

3 ответа

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

$ 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

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

2
ответ дан 3 December 2019 в 06:38

Используя 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
3
ответ дан 3 December 2019 в 06:38

Не очень симпатичный, но Вы могли использовать что-то как

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

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

Или повторить входную строку многократно

awk '{A=$0
b=gsub(/banana/, "")
for (i=1; i<=b; i++) print A
}' <tempfile
0
ответ дан 3 December 2019 в 06:38

Другие вопросы по тегам:

Похожие вопросы: