最初の列の値が一定/同じである2番目と3番目の列の値を計算します。

最初の列の値が一定/同じである2番目と3番目の列の値を計算します。

最初の列の値が同じタブ区切りのtxtファイルの2番目と3番目の列で、値/単語の発生回数を計算したいと思います。

入力ファイル:

GeneA Pathogenic snp
GeneA Pathogenic snp
GeneA Benign indel
GeneA Likely_pathogenic snp
GeneA Pathogenic    indel
GeneB Benign    snp
GeneB Pathogenic    snp
GeneB Benign    indel
GeneC  Benign   snp
GeneC  Likely_pathogenic    snp

期待される出力:(テーブル形式)

| Pathogenic | Benign | Likely_Pathogenic | snp | indel |
 ------------|--------|-------------------|-----|-------|
|GeneA|     3|       1|                  1|    3|      2|
|GeneB|     1|       2|                  0|    2|      1|
|GeneC|     0|       1|                  1|    2|      0|

ベストアンサー1

以下に示すスクリプトは、awk指定されたファイルからデータを収集し、各「名前」(最初の列)から各「タイプ」(2番目の列以上)の発生回数を計算します。すべての入力データにカンマが含まれていないと仮定して、他のプログラムにインポートできる単純なCSV形式を出力します。

{
        genes[$1] = 1
        for (i = 2; i <= NF; ++i) {
                types[$i] = 1
                counts[$1,$i]++
        }
}

END {
        OFS = ","

        $0 = "name"
        for (t in types)
                $(NF+1) = header[++n] = t
        print

        for (g in genes) {
                $0 = g
                for (i = 1; i <= n; ++i)
                        $(NF+1) = counts[g,header[i]]+0
                print
        }
}

genes配列は、types名前と型をキーとして含む連想配列です。このcounts配列は、入力に特定の名前と型がペアで表示される回数を計算します。

このENDブロックはタイトルを生成して出力し、すべての遺伝子名を繰り返し、各タイプについて収集された数を出力します。

これをテストしてみてください。

$ awk -f script file
name,indel,Benign,Likely_pathogenic,snp,Pathogenic
GeneA,2,1,1,3,3
GeneB,1,2,0,2,1
GeneC,0,1,1,2,0
$ awk -f script file | column -t -s,
name   indel  Benign  Likely_pathogenic  snp  Pathogenic
GeneA  2      1       1                  3    3
GeneB  1      2       0                  2    1
GeneC  0      1       1                  2    0
$ awk -f script file | csvlook
| name  | indel | Benign | Likely_pathogenic | snp | Pathogenic |
| ----- | ----- | ------ | ----------------- | --- | ---------- |
| GeneA |     2 |      1 |              True |   3 |          3 |
| GeneB |     1 |      2 |             False |   2 |          1 |
| GeneC |     0 |      1 |              True |   2 |          0 |

(望まない場合csvlookデータから型を推測するには、そのデータとその-Iオプションを使用してください。 )

おすすめ記事