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
$