![在 Linux 中用字母计数行数](https://linux22.com/image/1376076/%E5%9C%A8%20Linux%20%E4%B8%AD%E7%94%A8%E5%AD%97%E6%AF%8D%E8%AE%A1%E6%95%B0%E8%A1%8C%E6%95%B0.png)
我有一个文件,其中包含多行filename
。
我想一次性计算出有多少行以字符“a”开头,以字符“b”开头等等。
我应该执行什么命令?
答案1
我不太确定我是否正确理解了你的问题,这是你要找的吗?
$ cat foo.input
afoo
abar
bfoo
bbar
bquux
cfoo
$ awk '{a[substr($0, 1, 1)]++}END{for (c in a)print c, a[c]}' foo.input
a 2
b 3
c 1
另一个更简单的解决方案是使用colrm
和uniq
:
$ colrm 2 < foo.input | uniq -c
2 a
3 b
1 c
答案2
这是一份完美的工作uniq
:
uniq -c -w 1 filename
-w 1
仅比较每行的第一个字符;-c
计算出现次数。
来自foo.input
Adrian 的回答你得到(不要混淆afoo
,等等;这些只是以,等等bfoo
开头的第一行)a
b
2 afoo
3 bfoo
1 cfoo
sort -n
如果希望按出现次数排序,请通过管道传输结果:
$ uniq -c -w 1 foo.input | sort -n
1 cfoo
2 afoo
3 bfoo
答案3
或者,如果您更喜欢使用 perl 和 grep:
perl -le '$, = "\n"; print ("a".."z")' | xargs -i grep -c '^{}' foo.input
答案4
另一种解决方案,因为有时记住小块并组装它们更容易:
$ cat foo.输入 阿福 一间酒吧 笨蛋 巴巴尔 比克 首席财务官 $ cat foo.input | cut -c 1 | tr'[[:upper:]]''[[:lower:]]'| sort | grep'^[az]'| uniq -c 2 一 3 b 一 c
单行解释:
cat
读取文件cut -c 1
修剪除每行第一个字符之外的所有内容tr '[[:upper:]]' '[[:lower:]]'
将大写字母替换为小写字母sort
... 对行进行排序grep '^[a-z]'
删除不以字母开头的行uniq -c
计算相同的行数