是否可以在一个命令中对文件中的多次出现进行 grep 计数?例如:
$ cat > file
blah alfa
beta blah
blah blahgamma
gamma
Run Code Online (Sandbox Code Playgroud)
我可以:
grep -c 'alfa' file
1
grep -c 'beta' file
1
grep -c 'gamma' file
2
Run Code Online (Sandbox Code Playgroud)
但是有可能像这样:
grep -c -e 'alfa' -e 'beta' -e 'gamma' -somemoreblackmagic file
Run Code Online (Sandbox Code Playgroud)
并获得每个人的计数?
alfa 1
beta 1
gamma 2
Run Code Online (Sandbox Code Playgroud)
小智 6
您只需使用grep、sort和uniq即可获得所需的内容。
grep -EIho 'alfa|beta|gamma' *|sort|uniq -c
Run Code Online (Sandbox Code Playgroud)
我不认为 grep 能够完成你想做的事情。
只需使用 awk 即可:-)
此解决方案可能不适用于大文件(未优化)。并且仅适用于普通单词 - 不适用于正则表达式。但如果需要的话,添加一些功能很容易。
低端版本的限制在下面的评论中概述:
awk '
{
split($0, b); for (i in b) ++A[b[i]]
}
END {
split("'"$*"'", a)
for (i in a) print sprintf("%s %d", a[i], A[a[i]])
}
'
Run Code Online (Sandbox Code Playgroud)
只需将搜索字符串直接提供给脚本即可
[编辑]
具有正则表达式支持的固定版本(请参阅下面的评论)。请告诉我是否还有任何未解决的问题。
# ---- my favorite ----
awk -F' ?-c ' '
BEGIN { split("'"$*"'", a) }
{ for (i = 2; a[i]; ++i) if (match($0, a[i])) ++A[i] }
END { for (i = 2; a[i]; ++i) if (A[i]) print a[i] " " A[i] }
'
# ---- my favorite ----
Run Code Online (Sandbox Code Playgroud)
示例用法:
script_name -c alfa -c beta -c gamma << !
alfa
beta
gamma
gamma
!
Run Code Online (Sandbox Code Playgroud)
给出:
alfa 1
beta 1
gamma 2
Run Code Online (Sandbox Code Playgroud)
正则表达式用法:
script_name -c "^al" -c "beta" -c gamma -c "m.$" << !
alfa
beta
gamma
gamma
!
Run Code Online (Sandbox Code Playgroud)
给出:
^al 1
beta 1
gamma 2
m.$ 2
Run Code Online (Sandbox Code Playgroud)
[/编辑]
| 归档时间: |
|
| 查看次数: |
17797 次 |
| 最近记录: |