Как считать возникновение определенной строки на определенной строке в файле?

Я знаю, что могу использовать туалет для возврата общего количества слов (и строки) в использовании файла:

wc <filename>

Существует ли способ возвратить счет для определенной строки на определенной строке файла?

Что-то как следующее:

wc -<flag> <line number> -<flag> <string> <filename>
7
задан 29 June 2017 в 14:06

5 ответов

Это должно быть сделано на трех шагах:

  1. Избранный номер строки N (пример использует строку 42):

    sed '42!d'
    
  2. Поиск строка для всех случаев определенного шаблона (здесь строка/регулярное выражение hello) и печать они отдельно:

    grep -o 'hello'
    
  3. считают соответствия:

    wc -l
    

Или помещать его в один единственный канал команды, читающий от file.txt:

sed '42!d' file.txt | grep -o 'hello' | wc -l
10
ответ дан 23 November 2019 в 06:07

Python

Вот один способ сделать это в 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

Как это работает:

  • мы выполняем интерпретатор Python с -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

Конечно, мы не должны придерживаться одних только языков сценариев. sed и grep обеспечьте достаточные инструменты, которые мы можем использовать для удовлетворения нашим потребностям. С grep -c мы можем считать возникновение подобранных строк, таким образом, все, что мы должны сделать, извлечь определенную строку, мы нуждаемся и разделяем все слова в той строке в отдельные строки. Как так:

$ sed -n  '2{s/ /\n/g;p}' input.txt | grep -c 'word'
3
7
ответ дан 23 November 2019 в 06:07

Это - хороший вариант использования для соединения инструментов Unix в конвейере.

line=5
str="ipsum"
sed -n "${line}p" filename | grep -o -- "$str" | wc -l

команда sed p производит данную строку файла и подает его в grep. Grep -o опция говорит этому производить все соответствия для данной строки, и каждое соответствие производится на отдельной строке. Вывод Grep питается в туалет, который считает количество строк.

8
ответ дан 23 November 2019 в 06:07

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
6
ответ дан 23 November 2019 в 06:07

Один способ сделать это, в perl:

perl -lne '
  BEGIN{($lineno, $str) = splice @ARGV,0,2} 
  print $c = () = /$str/g if $. == $lineno
' <lineno> <string> <filename>
5
ответ дан 23 November 2019 в 06:07

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

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