2016-04-06 10 views
0

タブ区切りのデータセットを処理するためにコードを修正する際に助けが必要です。例のデータは:awk配列の要素の数のパターンが一致します

#ID type 
A 3 
A Ct 
A Ct 
A chloroplast 
B Ct 
B Ct 
B chloroplast 
B chloroplast 
B 4 
C Ct 
C Ct 
C chloroplast 

列#1の各固有の要素について、パターン「Ct」に一致する要素と一致しない要素を数えたいと思います。 だから、期待される出力が

#ID count_for_matches count_for_unmatched 
A 2 2 
B 2 3 
C 2 1 

である私は、パターンにカウントを取得することができ、この

awk '$2~/Ct/{x++};$2!~/Ct/{y++}END{print x,y} 

と一致したと私は

のような配列としてのカラム#1を定義することにより、各項目の処理を行うことができます知っています
awk '{a[$1]++}END{for (i in a) print i}' 

しかし、両方の機能コードを組み合わせることはできません。私は

awk '{a[$1]++}END{for (i in a){$2~/Ct/{x++};$2!~/Ctt/{y++}}END{print i,x,y}}}' 

のようないくつかの組み合わせを試してみました。しかし、私は明らかにいくつかのエラーを作っていますし、この問題を解決するためにどのように答える私はフォーラムに基づいて把握することはできません。おそらく$ 2の値は[$ 1]で保存する必要がありますか?誰かがエラーを指摘できれば感謝します!ここ

答えて

1
$ cat tst.awk 
BEGIN { FS=OFS="\t" } 
NR==1 { next } 
!seen[$1]++ { keys[++numKeys] = $1 } 
$2=="Ct" { matches[$1]++; next } 
{ unmatched[$1]++ } 
END { 
    print "#ID", "count_for_matches", "count_for_unmatched" 
    for (keyNr=1; keyNr<=numKeys; keyNr++) { 
     key = keys[keyNr] 
     print key, matches[key]+0, unmatched[key]+0 
    } 
} 

$ awk -f tst.awk file 
#ID  count_for_matches  count_for_unmatched 
A  2  2 
B  2  3 
C  2  1 
1

は別のミニマリストのバージョン

$ awk 'NR==1{print $1,"count_for_matches","count_for_unmatches";next} 
    $2=="Ct"{m[$1]++} 
      {a[$1]++} 
     END{for(k in a) print k, m[k], a[k]-m[k]}' file | 
column -t 

#ID count_for_matches count_for_unmatches 
A 2     2 
B 2     3 
C 2     1 
ある
関連する問題