Bash
根據列中 TRUE 值的比例從 TRUE/FALSE 矩陣中提取列
我有一個像下面這樣的文本文件,儘管幾乎有很多列。我想提取具有特定比例/數量的 TRUE 值的列名,例如 9 行中有 2 行具有 TRUE 的列(具有 TRUE/FALSE 值)。
或者,最好提取具有至少一定數量(例如 2)的 TRUE 值的列。在上面的範例中,它將是具有 2 到可能 9 行的 TRUE 值的列。應該可以推廣到具有不同行數的文件。
謝謝!
輸入文件範例:
Comparison MT group1 group1.1 group1.2 group1.3 group1.4 group1.5 group1.6 group1.7 group1.8 group1.9 BP:HA FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE CB:HA FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE HA:PI TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE AL:GR FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE AL:LA TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE AL:PL FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE GR:PP FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE LA:PP TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE PL:PP FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
具有 2 個或更多 TRUE 值的列的期望結果:
輸出文件:
MT group1 group1.9
掃描所有列並累積每列的“TRUE”計數。
最後,列印所有等於或大於設定點的列:
#!/bin/bash awk -vprop="${1:-0.3}" ' NR==1{split($0,fields);next}; {for(i=2;i<=NF;i++){ if($i=="TRUE" ){t[i]++}; if($i=="FALSE"){f[i]++} } } END{ for(j in t) if( (1/(1+f[j]/t[j])) >= prop){ printf("%-10s\t%s\t%s\n",fields[j],j,1/(1+f[j]/t[j]) ) } }' infile
執行時(對於您提供的數據):
$ ./script 0.001 MT i=2 t=3 f=6 p=0.333 group1 i=3 t=2 f=7 p=0.222 group1.8 i=11 t=1 f=8 p=0.111 group1.9 i=12 t=3 f=6 p=0.333
第 2 列 (MT) 有超過 1 個 TRUE 值:實際上是 3 個。
第 3 列 (group1) 有 2 個 TRUE 值。
第 11 列 (group1.8) 有 1 個 TRUE 值。第 12 列 (group1.9) 有 3 個 TRUE 值。
如果不提供比例,則預設為 0.3。
$ ./script MT i=2 t=3 f=6 p=0.333 group1 i=3 t=2 f=7 p=0.222 group1.9 i=12 t=3 f=6 p=0.333