2

桌子

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

注意:我的实际表格是几千万行,所以我不想写一个表格作为中间来计数。(我也需要对其他文件重复此任务)。

4

1 回答 1

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

注意 printcount + 0而不是count. 这样,我们将变量转换0为之前未设置的变量。0有了这个,它就会在没有匹配的时候打印;如果我们只是print count,它将返回一个空字符串。

于 2016-04-25T11:31:15.263 回答