Подсчитать количество строк, совпадающих между двумя строками из файла - PullRequest
0 голосов
/ 29 мая 2018

У меня есть вызов.У меня есть этот текст:

characteristic "type"
   value "A"
   value "B"
   value "C" 
   default-value "B" 
exit 
characteristic "active"
   value "no"
   value "yes"
   default-value "no" 
exit
characteristic "traffic"
   value "disabled" 
   value "enabled"
   default-value "enabled"
exit
characteristic "quota" 
   value "enabled"
   default-value "disabled"
exit
characteristic "redirect"
   value "disabled"
   value "enabled"
   default-value "disabled"
exit

Я хочу знать, сколько раз слово «значение» между «характеристикой» и «выходом».Итак, я надеюсь что-то вроде этого:

3
2
2
1
2

Я пытался использовать sed и grep , но я не могу получить sed вернуть меня nth Вхождение '-n -e "/ ^ характеристика /, / ^ выход / p"'.Я уверен, что bash может сделать это без большого количества do while / done и , если .

Я ценю вашу помощь.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Я решил попытаться решить эту проблему с помощью команды GNU sed e.

Это позволяет знакомым с sed командам встроенных командных оболочек выполнять такие действия, как подсчет слов.

Идея заключалась в том, чтосжать каждую секцию до одной строки и передать ее в grep -ow value | wc -l для подсчета вхождений слова «значение».

Команда: sed -f char.sed input-file

Где командный файл char.sedдля sed это:

:a
/exit/{
  s/\n/ /g
  s/-/b/g
  s/^/echo /
  s/$/ | grep -ow value | wc -l/
  e
  n
}
N
ba

Что означает N в каждой строке до тех пор, пока /exit/ в этой точке символы новой строки не будут заменены пробелами, тире заменены на b (так что «значение по умолчанию» нене соответствует grep -w value).Затем всей строке предшествует echo и суффикс | grep -ow value | wc -l.Команда e затем используется для выполнения команды в том виде, в котором она создана, и вставляет вывод команды в выходной поток.

0 голосов
/ 29 мая 2018

Я бы сказал:

awk '$1 == "characteristic" { ctr = 0 } $1 == "exit" { print ctr } $1 == "value" { ++ctr }' filename

Очень просто:

$1 == "characteristic" { ctr = 0 }  # Start of a new section: reset counter
$1 == "exit" { print ctr }          # end of section: print counter
$1 == "value" { ++ctr }             # value line: increase counter
...