shell 如何计算后面跟有特定值的出现次数?(添加if语句)

ru9i0ody  于 2022-11-16  发布在  Shell
关注(0)|答案(2)|浏览(156)

我如何计算E* 之后的特定值的出现次数?例如:“EXXXX”?
file.txt:

E2dd,Rv0761,Rv1408  
2s32,Rv0761,Rv1862,Rv3086  
6r87,Rv0761
Rv2fd90c,Rv1408
Esf62,Rv0761
Evsf62,Rv3086

我尝试输入:

awk -F, '{map[$2]++} END { for (key in map) { print key, map[key] } }' file.txt

并加上:

if [[ $line2 == `E*` ]];then

但不工作,有语法错误
预期输出:

total no of occurrences: 
Rv0761: 2
Rv3086:1

现在,我只能计算第二个值的所有出现次数。

j0pj023g

j0pj023g1#

if [[ $line2 == `E*` ]];then

这肯定不是法律的的GNU AWK if语句,请参考If Statement以找到允许的内容,尽管在这种情况下并不需要,因为您可能会如下所示,让file.txt内容为

E2dd,Rv0761,Rv1408  
2s32,Rv0761,Rv1862,Rv3086  
6r87,Rv0761
Rv2fd90c,Rv1408
Esf62,Rv0761
Evsf62,Rv3086

然后

awk 'BEGIN{FS=","}($1~/^E/){map[$2]++} END { for (key in map) { print key, map[key] } }' file.txt

给出输出

Rv3086 1
Rv0761 2

说明:操作(包含在{ ... }中)前面可以有模式,这会将它们的执行限制到与模式匹配的行(换句话说:条件成立)在上例中,模式为$1~/^E/,这意味着第1列确实以E开始。

  • (在gawk 4.2.1中测试)*
laawzig2

laawzig22#

您差得太近了。您只缺少REGEX来识别以'E'开头的记录,然后在输出中连接":"以产生您想要的结果(不按排序顺序)。例如,您可以执行以下操作:

awk -F, '/^E/{map[$2]++} END { for (key in map) { print key ":", map[key] } }' file.txt

示例输出

使用file.txt的数据,您将得到:

Rv3086: 1
Rv0761: 2

如果需要以某种方式对输出进行排序,只需使用管道将awk命令的输出传输到sort,并使用所需的任何选项。

相关问题