Я знаю, что могу использовать туалет для возврата общего количества слов (и строки) в использовании файла:
wc <filename>
Существует ли способ возвратить счет для определенной строки на определенной строке файла?
Что-то как следующее:
wc -<flag> <line number> -<flag> <string> <filename>
Это должно быть сделано на трех шагах:
Избранный номер строки N (пример использует строку 42):
sed '42!d'
Поиск строка для всех случаев определенного шаблона (здесь строка/регулярное выражение hello
) и печать они отдельно:
grep -o 'hello'
считают соответствия:
wc -l
Или помещать его в один единственный канал команды, читающий от file.txt
:
sed '42!d' file.txt | grep -o 'hello' | wc -l
Вот один способ сделать это в Python через понимание списка (см. ниже для альтернативной более короткой версии).
$ python -c 'import sys;print([ l for i,l in enumerate(sys.stdin,1) if i==2][0].count("word"))' < input.txt
3
$ cat input.txt
nothing here
word and another word, and one more word
last line
Как это работает:
-c
отметьте, были команды, содержатся в одинарных кавычках;input.txt
перенаправляется в stdin
поток интерпретатора Python через <
оператор оболочки. Следовательно нам нужно sys
модуль.[something for item in something]
, мы читаем строки текста от sys.stdin
. enumerate(sys.stdin,1)
позволяет нам рассчитывать, перечисляют строки, т.е. с каждым повторением понимания списка, мы получим строку текста в l
переменная и индекс в i
переменная, начинающая количество в 1.i==2
отфильтрует только строку, которой индекс равняется 2. Это - то, как мы знаем который строка извлечь.0
. Так, мы обращаемся к тому объекту как [<list comprehension stuff here>][0]
. - .count("word")
то, что на самом деле делает задание подсчета. По определению это возвращает много неперекрывающихся случаев подстроки в строке.print()
оператор. Так безотносительно нумеруют .count()
возвраты метода обнаружатся на экране.Более короткий способ сделать то же в Python состоял бы в том, чтобы использовать readlines()
метод вместо понимания списка, и отсылает к определенному объекту в списке это readlines()
производит. Отметьте, это readlines()
производит список и перечисляет в Python, 0-индексируемы, что означает, хотите ли Вы считать строку x, Вы должны объект списка ссылок x-1. Например,
$ python -c 'import sys;print(sys.stdin.readlines()[1].count("word"))' < input.txt
3
Конечно, мы не должны придерживаться одних только языков сценариев. sed
и grep
обеспечьте достаточные инструменты, которые мы можем использовать для удовлетворения нашим потребностям. С grep -c
мы можем считать возникновение подобранных строк, таким образом, все, что мы должны сделать, извлечь определенную строку, мы нуждаемся и разделяем все слова в той строке в отдельные строки. Как так:
$ sed -n '2{s/ /\n/g;p}' input.txt | grep -c 'word'
3
Это - хороший вариант использования для соединения инструментов Unix в конвейере.
line=5
str="ipsum"
sed -n "${line}p" filename | grep -o -- "$str" | wc -l
команда sed p
производит данную строку файла и подает его в grep. Grep -o
опция говорит этому производить все соответствия для данной строки, и каждое соответствие производится на отдельной строке. Вывод Grep питается в туалет, который считает количество строк.
awk
решение:
awk 'NR==X { print gsub("word",""); }' file
X
с Вашим определенным номером строки. gsub
количество возвратов замены "слова", похож, мы считаем его. Exampe:
$ cat file:
a b c a a d
d e f f f 1
позволяют нам видеть, сколько 'f' мы вошли в строку "2":
$ awk 'NR==2 { print gsub("f",""); }' file
3
Один способ сделать это, в perl
:
perl -lne '
BEGIN{($lineno, $str) = splice @ARGV,0,2}
print $c = () = /$str/g if $. == $lineno
' <lineno> <string> <filename>