计算文件中2个字符串之间匹配的行数

时间:2018-05-28 21:38:26

标签: linux bash text sed grep

我遇到了挑战。我有这样的文字:

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 / done if 的情况下完成。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我说:

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

答案 1 :(得分:0)

我决定尝试用GNU sed的e命令来解决这个问题。

这允许那些熟悉sed内联shell命令的人做一些像计算单词的事情。

我们的想法是将每个部分压缩为一行,并将其传递给grep -ow value | wc -l以计算“值”一词的出现次数。

命令:sed -f char.sed input-file

sed的char.sed命令文件是:

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

N之前,每行上/exit/的作用是grep -w value,此时换行符用空格替换,短划线用b替换(因此“default-value”不匹配{{1} }})。然后整行以echo为前缀,后缀为| grep -ow value | wc -l。然后使用e命令执行构造的命令,并将命令的输出粘贴在输出流中。