如何按字母顺序计算一列中的所有字母

如何按字母顺序计算一列中的所有字母

如何计算文件中从“a”到“z”的列中的所有字母,.tsv并输出告诉我每个字母出现的频率?

例如,假设这是一列

abc
abd
aabf

我想要的输出是这样的:

4 a 
3 b
1 c
1 d
1 f

答案1

grep,sortuniq:

$ grep -o '[a-z]' file | sort | uniq -c
      4 a
      3 b
      1 c
      1 d
      1 f

您可以使用以下命令删除前导空格sed

$ grep -o '[a-z]' file | sort | uniq -c | sed 's/^ *//'
4 a
3 b
1 c
1 d
1 f

cut如果您只需要第七列,请在前面添加:

cut -f7 file | grep -o '[a-z]' | sort | uniq -c | sed 's/^ *//'

答案2

仅使用基本工具+ csvcut

csvcut -c 7 file | tr -d '\n' | fold -w1 | sort | uniq -c

输出

  4 a
  3 b
  1 c
  1 d
  1 f

答案3

使用列出的工具(cut、sed、sort、uniq),除了 shell 之外不使用其他工具

#!/bin/bash
column=$1
shift
cut -d'\t' -f$column  "$@" | 
    sed 's/[^a-z]//g;s/./&\n/g' | 
    grep . | sort | uniq -c

使用它来myprog 7 file1 file2获取 file1 file2 中的第 7 列。

答案4

A单线救援(没有管道,只有一个过程):

perl -0ane '
    map { $h{$_}++ } sort grep { /\w/ } split //, $F[6];
    print "$h{$_} $_\n" for sort keys %h
' file

我喜欢 Perl,因为它非常简洁管状连锁呼叫套装。

其背后的想法是创建一个 HASH ( $h) 并迭代每个字符并计算出现次数:$h->{$_}++

打印之前的哈希值如下所示:

$VAR1 = {
          'a' => 4,
          'c' => 1,
          'f' => 1,
          'd' => 1,
          'b' => 3
        };

输出

4 a
3 b
1 c
1 d
1 f

相关内容