无论大小写如何计算出现次数?

How to count occurrences no matter its case?

table

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 '  ==/^[Cc][Aa]/{++count} END {print count}'

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

下面的命令returns值为1

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

注:我的实际table有几千万行,不想中间写一个table来统计。 (我也需要对其他文件重复此任务)。

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

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

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

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

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