1列のすべての文字をアルファベット順に計算する方法

1列のすべての文字をアルファベット順に計算する方法

ファイル内の「a」から「z」までの列のすべての文字をどのように計算し、.tsv各文字がどのくらいの頻度で表示されるかを出力で知ることができますか?

たとえば、これが列であるとします。

abc
abd
aabf

私が望む出力は次のとおりです。

4 a 
3 b
1 c
1 d
1 f

答え1

そしてgrepsortそしてuniq

$ 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

cut7番目の列のみが必要な場合は、前に次を追加してください。

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)を使用し、シェル以外のツールを使用しないでください。

#!/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 file2file1 file2 の列 7 を取得します。

答え4

シングルライン構造(パイプラインなし、単一プロセス):

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

関連情報