最初の列の値が同じタブ区切りの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
オプションを使用してください。 )