【问题标题】:AWK how to count patterns on the first column?AWK如何计算第一列的模式?
【发布时间】:2016-12-29 08:54:22
【问题描述】:

我试图从中获取“??”、“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
  • 正确的解决方案是使用 Subversion 的机器可读输出格式并对其进行解析。但是,XML 相当复杂,因此您会发现很多现有的解决方案与您在此处尝试的解决方案类似。你谷歌了吗?

标签: awk gawk


【解决方案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

这里你需要发送一个\,以便?s 在正则表达式中被转义。由于\ 本身就是传递给 awk 的字符串中的一个特殊字符,因此您需要先对其进行转义(因此需要使用双反斜杠)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多