无论如何计算出现次数?

时间:2016-04-25 11:29:09

标签: awk count ignore-case

chr10   10482   10484   0   11  +   CA
chr10   10486   10488   0   12  +   ca
chr10   10487   10489   0   13  +   Ca
chr10   10490   10492   0   13  +   cA
chr10   10491   10493   0   12  +   CT
chr10   10494   10496   6.66667 15  +   ca
chr10   10495   10497   6.66667 15  +   cc

我想计算第7列中可以找到“CA”的行数,无论这两个字母中的任何一个是大写还是小写。

所需的输出为5。

这两个命令(下面)给出一个空输出

cat table | awk ' $7 ==/^[Cc][Aa]/{++count} END {print count}'

awk 'BEGIN {IGNORECASE = 1} $7==/"CA"/ {++count} END {print count}' table

以下命令返回值1

awk 'BEGIN {IGNORECASE = 1} END {if ($7=="CA"){++count} {print count}}' table

注意:我的实际表格长达数千万行,因此我不想将表格作为中间值来计算。 (我还需要为其他文件重复此任务)。

1 个答案:

答案 0 :(得分:3)

您的语法有一点问题:您要么说var == "string",要么说var ~ regexp,但您说的是var ~ /"string"/。使用正确的组合可以使命令工作:

$ awk '$7 ~ /^[Cc][Aa]/{++count} END {print count+0}' file
5
$ awk 'BEGIN {IGNORECASE = 1} $7=="CA" {++count} END {print count+0}' file
5

此外,您可能希望使用toupper()(或tolower())来检查此项,而不是使用IGNORECASE标记:

awk 'toupper($7) == "CA" {++count} END {print count+0}' file

请注意打印count + 0而非count的技巧。这样,如果之前没有设置,我们会将变量转换为0。这样,只要没有匹配,就会打印0;如果我们只是print count,它将返回一个空字符串。