我正在尝试从中获取“??”,“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}'
答案 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的字符串中的一个特殊字符,所以你需要先将它转义(因此是双反斜杠)。