在 Linux 中用字母计数行数

在 Linux 中用字母计数行数

我有一个文件,其中包含多行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

另一个更简单的解决方案是使用colrmuniq

$ colrm 2 < foo.input | uniq -c
      2 a
      3 b
      1 c

答案2

这是一份完美的工作uniq

uniq -c -w 1 filename

-w 1仅比较每行的第一个字符;-c计算出现次数。

来自foo.inputAdrian 的回答你得到(不要混淆afoo,等等;这些只是以,等等bfoo开头的第一行)ab

    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计算相同的行数

相关内容