Ответвление от этого вопроса:
При поиске строки "банан" из следующего файла мы хотели бы 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
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
Основная идея здесь состоит в том, что мы циклично выполняемся по каждому слову в строке и соответствиям количества. Если существует соответствие, мы увеличиваем счетчик и затем используем это в противоречии с печатью та же строка в цикле. Наконец счетчик сбрасывается и повторения процесса
Используя 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
Это работает при помощи awk
gsub
управляйте для замены шаблоном соответствия (здесь, банан), и он возвращает количество раз, что он выполняет замену. Если затем выводы входной номер строки и количество соответствий
Или повторить входную строку многократно
awk '{A=$0
b=gsub(/banana/, "")
for (i=1; i<=b; i++) print A
}' <tempfile