如何计算仅后跟E*之后的特定值的出现次数?例如:"XXXX"?
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
现在我只能计算第二个值的所有出现次数
if [[ $line2 == `E*` ]];then
这绝对不是合法的GNUAWK
if语句,请参阅if语句以找到允许的内容,尽管在这种情况下不需要它,因为您可能会如下所示,让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/
,这意味着第一列确实以E
开始。
(在gawk 4.2.1中测试(
你太接近了。您只缺少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
即可。