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

Попробуйте:

gvim -c "winpos 1600 0"

, где, например, 1600 - ширина пикселя левого монитора. Это должно заставить его начать работу с первым пикселем правильного монитора. Для получения дополнительной информации см. [F2] в vim.

6
задан 30 June 2017 в 00:06

15 ответов

Это нужно сделать в три этапа:

Выбрать номер строки N (пример использует строку 42):
sed '42!d'
Искать строку для всех вхождений определенного шаблона (здесь строка / регулярное выражение hello) и напечатайте их отдельно:
grep -o 'hello'
Подсчитайте совпадения:
wc -l

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

sed '42!d' file.txt | grep -o 'hello' | wc -l
9
ответ дан 22 May 2018 в 21:01
  • 1
    grep имеет режим подсчета, wc не нужен – hildred 30 June 2017 в 03:30
  • 2
    @hildred grep -c подсчитывает совпадение строк - не так много, чтобы получить количество совпадающих строк в одной строке – steeldriver 30 June 2017 в 04:41
  • 3
    На самом деле, если вы разделите эту строку с sed на несколько строк, тогда grep -c может использоваться без проблем – Sergiy Kolodyazhnyy 30 June 2017 в 20:06
  • 4
    @SergiyKolodyazhnyy, но тогда вы будете уходить с вашего пути, чтобы сделать что-то надуманное. Философия Unix предназначена для того, чтобы программы были сфокусированы и сгруппированы. grep для поиска, а wc - для подсчета. Составление их более естественно, и в этом нет ничего плохого. – JoL 30 June 2017 в 22:28
  • 5
    @jlmg нет ничего особенно надуманного в отношении такого подхода. Вывод строки и разбиение ее на несколько строк не противоречит философии Unix. sed выполняет свою работу, grep выполняет свою работу, и мы просто соединяем их вместе. См. Мой asnwer, я добавил это как решение – Sergiy Kolodyazhnyy 30 June 2017 в 22:38

Это нужно сделать в три этапа:

Выбрать номер строки N (пример использует строку 42): sed '42!d' Искать строку для всех вхождений определенного шаблона (здесь строка / регулярное выражение hello) и напечатайте их отдельно: grep -o 'hello' Подсчитайте совпадения: wc -l

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

sed '42!d' file.txt | grep -o 'hello' | wc -l
9
ответ дан 18 July 2018 в 10:55

Это нужно сделать в три этапа:

Выбрать номер строки N (пример использует строку 42): sed '42!d' Искать строку для всех вхождений определенного шаблона (здесь строка / регулярное выражение hello) и напечатайте их отдельно: grep -o 'hello' Подсчитайте совпадения: wc -l

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

sed '42!d' file.txt | grep -o 'hello' | wc -l
9
ответ дан 24 July 2018 в 19:40

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

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

Команда sed p выводит данную строку файла и передает ее в grep. Опция Grep's -o сообщает ему вывод всех совпадений для данной строки, и каждое соответствие выводится на отдельной строке. Выход Grep подается на wc, который подсчитывает количество строк.

8
ответ дан 22 May 2018 в 21:01

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
ответ дан 22 May 2018 в 21:01
  • 1
    Почему вы читаете из sys.stdin вместо того, чтобы просто открывать файл на Python, используя open("input.txt")? – Byte Commander 30 June 2017 в 09:34
  • 2
    @ByteCommander нет особой причины. Это тоже можно сделать. Хотя open() делает линию немного длиннее. Нет никакого особого преимущества в любом случае, хотя – Sergiy Kolodyazhnyy 30 June 2017 в 09:37
  • 3
    python -c 'n,w,f=2,"word",open("input.txt");[f.readline()for _ in range(n-1)];print(f.readline().count(w))' было бы моим личным предложением. – Byte Commander 30 June 2017 в 09:45
  • 4
    @ByteCommander на ваш первый комментарий: Вероятно, потому что не вызывать метод close на результат open является утечкой памяти? – cat 30 June 2017 в 19:52
  • 5
    @jlmg Python будет работать с пробелами, sed + grep один не будет, согласился там – Sergiy Kolodyazhnyy 30 June 2017 в 23:15

awk:

awk 'NR==X { print gsub("word",""); }' file
измените X на свой номер конкретной линии. измените слово «слово» на требуемое слово. gsub возвращает номер замены слова, похоже, мы его подсчитываем.

Экзамен:

$ 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
ответ дан 22 May 2018 в 21:01

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

perl -lne '
  BEGIN{($lineno, $str) = splice @ARGV,0,2} 
  print $c = () = /$str/g if $. == $lineno
' <lineno> <string> <filename>
5
ответ дан 22 May 2018 в 21:01

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

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

Команда sed p выводит данную строку файла и передает ее в grep. Опция Grep's -o сообщает ему вывод всех совпадений для данной строки, и каждое соответствие выводится на отдельной строке. Выход Grep подается на wc, который подсчитывает количество строк.

8
ответ дан 18 July 2018 в 10:55

awk:

awk 'NR==X { print gsub("word",""); }' file измените X на свой номер конкретной линии. измените слово «слово» на требуемое слово. gsub возвращает номер замены слова, похоже, мы его подсчитываем.

Экзамен:

$ 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
ответ дан 18 July 2018 в 10:55

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
ответ дан 18 July 2018 в 10:55

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

perl -lne ' BEGIN{($lineno, $str) = splice @ARGV,0,2} print $c = () = /$str/g if $. == $lineno ' <lineno> <string> <filename>
5
ответ дан 18 July 2018 в 10:55

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

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

Команда sed p выводит данную строку файла и передает ее в grep. Опция Grep's -o сообщает ему вывод всех совпадений для данной строки, и каждое соответствие выводится на отдельной строке. Выход Grep подается на wc, который подсчитывает количество строк.

8
ответ дан 24 July 2018 в 19:40

awk:

awk 'NR==X { print gsub("word",""); }' file измените X на свой номер конкретной линии. измените слово «слово» на требуемое слово. gsub возвращает номер замены слова, похоже, мы его подсчитываем.

Экзамен:

$ 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
ответ дан 24 July 2018 в 19:40

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
ответ дан 24 July 2018 в 19:40
  • 1
    Почему вы читаете из sys.stdin вместо того, чтобы просто открывать файл на Python, используя open("input.txt")? – Byte Commander 30 June 2017 в 09:34
  • 2
    @ByteCommander нет особой причины. Это тоже можно сделать. Хотя open() делает линию немного длиннее. Нет никакого особого преимущества в любом случае, хотя – Sergiy Kolodyazhnyy 30 June 2017 в 09:37
  • 3
    python -c 'n,w,f=2,"word",open("input.txt");[f.readline()for _ in range(n-1)];print(f.readline().count(w))' было бы моим личным предложением. – Byte Commander 30 June 2017 в 09:45
  • 4
    @ByteCommander на ваш первый комментарий: Вероятно, потому что не вызывать метод close на результат open является утечкой памяти? – cat 30 June 2017 в 19:52
  • 5
    @jlmg Python будет работать с пробелами, sed + grep один не будет, согласился там – Sergiy Kolodyazhnyy 30 June 2017 в 23:15

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

perl -lne ' BEGIN{($lineno, $str) = splice @ARGV,0,2} print $c = () = /$str/g if $. == $lineno ' <lineno> <string> <filename>
5
ответ дан 24 July 2018 в 19:40

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

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