我有一个大文件,其中的条目如下所示:
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
部分处理的标志c
empType: 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
并在满足条件的情况下递增。- 我们打印
$n
(END
添加0
以确保我们得到的0
不是空字符串,如果没有匹配的话)。