Shell 如何使用grep-c计算文件中各种字符串的出现次数?
我有一大堆文件,里面有一家公司的数据,我需要数一数,比如说,有多少人来自某个城市。起初,我是用手工操作的Shell 如何使用grep-c计算文件中各种字符串的出现次数?,shell,grep,Shell,Grep,我有一大堆文件,里面有一家公司的数据,我需要数一数,比如说,有多少人来自某个城市。起初,我是用手工操作的 grep -c 'Chicago' file.csv 但现在我必须寻找很多城市,每次手动操作都会很费时。所以我做了一些研究发现: #!/bin/sh for p in 'Chicago' 'Washington' 'New York'; do grep -c '$p' 'file.csv' done 但它不起作用。它一直给我0作为输出,我不知道是什么问题。总之,基本上我需要的是在一列
grep -c 'Chicago' file.csv
但现在我必须寻找很多城市,每次手动操作都会很费时。所以我做了一些研究发现:
#!/bin/sh
for p in 'Chicago' 'Washington' 'New York'; do
grep -c '$p' 'file.csv'
done
但它不起作用。它一直给我0作为输出,我不知道是什么问题。总之,基本上我需要的是在一列中输出grep给出的每个结果(只是值),这样我就可以直接复制到电子表格中。例:
132
407
523
提前感谢。从标题来看,听起来你想计算字符串出现的次数,而不是字符串出现的行数,但是既然你接受了
grep-c
答案,我就假设你实际上只关心后者。不要使用grep
并多次读取该文件。一次清点一切:
awk '/Chicago/ {c++} /Washington/ {w++} /New York/ {n++}
END { print c; print w; print n }' input-file
请注意,这将为任何未出现的字符串打印一个空行而不是“0”,因此您可能不想初始化。有几种方法可以做到这一点。我喜欢:
awk '/Chicago/ {c++} /Washington/ {w++} /New York/ {n++}
END { print c; print w; print n }' c=0 w=0 n=0 input-file
您应该使用排序+uniq:
$ awk '{print $<N>}' file.csv | sort | uniq -c
变量不在单引号内展开。我不知道,它现在可以工作了。非常感谢=)事实上我不知道grep只计算单词出现的行数,但就我而言,它工作得很好。它是一个.csv文件,因此城市出现在城市列中,每行只显示一次。谢谢你的提示,这其实很简单,也很有帮助。下次我会记住这一点。
$ awk -F: '{print $7}' /etc/passwd | sort | uniq -c
1 /bin/bash
1 /bin/sync
1 /bin/zsh
1 /sbin/halt
41 /sbin/nologin
1 /sbin/shutdown
$