Bash

根據列中 TRUE 值的比例從 TRUE/FALSE 矩陣中提取列

  • June 21, 2018

我有一個像下面這樣的文本文件,儘管幾乎有很多列。我想提取具有特定比例/數量的 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

引用自:https://unix.stackexchange.com/questions/419443