AWK如何计算第一列的模式?

时间:2016-12-29 00:24:19

标签: awk gawk

我正在尝试从中获取“??”,“M”,“A”和“D”的总数:

?? this is a sentence
 M this is another one
A  more text here
D  more and more text

我有这个示例代码行,但不起作用:

 awk -v pattern="\?\?" '{$1 == pattern} END{print " "FNR}'

1 个答案:

答案 0 :(得分:1)

$ awk '{ print $1 }' file | sort | uniq -c 
1 ??
1 A
1 D
1 M

如果由于某种原因你想要一个仅支持awk的解决方案:

awk '{ ++cnt[$1] } END { for (i in cnt) print cnt[i], i }' file

但我认为与使用已经完成大部分工作的内置unix工具相比,这是不必要的复杂。

如果您只想计算一个特定值:

awk -v value='??' '$1 == value' file | wc -l

如果您只想计算一部分值,可以使用正则表达式:

$ awk -v pattern='A|D|(\\?\\?)' '$1 ~ pattern { print $1 }' file | sort | uniq -c
1 ??
1 A
1 D

在这里,您需要发送\,以便在正则表达式中转义?。因为\本身是传递给awk的字符串中的一个特殊字符,所以你需要先将它转义(因此是双反斜杠)。