获取文件中对象的匹配计数

获取文件中对象的匹配计数

我有一个大文件,其中的条目如下所示:

entry-id: 1
sn: John
cn: Smith
empType: A
ADID: 123456

entry-id: 2
sn: James
cn: Smith
empType: B
ADID: 123456

entry-id: 3
sn: Jobu
cn: Smith
empType: A
ADID: 123456

entry-id: 4
sn: Jobu
cn: Smith
empType: A
ADID: 

每个条目均由换行符分隔。我需要对 empType 为 A 的条目进行计数,并且 ADID 之后还必须有一个值(总共 2 个)。我尝试过使用 awk、grep 和egrep,但仍然没有运气。有任何想法吗?

答案1

Awk解决方案:

awk '/empType: /{ f=($2=="A"? 1:0) }f && /ADID: [0-9]+/{ c++ }END{ print c }' file
  • f- 指示empType: A部分处理的标志
  • cempType: A-带填充ADID键的条目计数

输出:

2

答案2

这是另一种 awk 解决方案,它使用空行""作为记录分隔符RS,使用新行\n作为字段分隔符FS

BEGIN {RS=""; FS="\n"}
{
    split($4,a,": ")
    split($5,b,": ")
}
a[2]=="A" && b[2]!="" {c++}
END {print c}

该脚本可以执行

awk -f main.awk file

答案3

简单的两种grep方法,其中数据是输入文件:

grep -A1 'empType: A' data | grep -c 'ADID: .\+'

输出:

2

答案4

对于perl,这可能是:

perl -l -00ne '
  my %f = /(.*?):\s*(.*)/g;
  ++$n if $f{empType} eq "A" && $f{ADID} ne "";
  END {print 0+$n}' < file
  • -n使给定的代码-e应用于每个输入记录
  • -00记录为段落。
  • 我们构建一个%f关联数组,其中键和值映射到(key):spaces(value)记录中的每个键和值。
  • $n并在满足条件的情况下递增。
  • 我们打印$nEND添加0以确保我们得到的0不是空字符串,如果没有匹配的话)。

相关内容