我有在 Linux 机器上运行的代码,它计算在给定列/字段中找到的 TRUES 的数量,将列号和该列中的 TRUE 数量打印为输出。
在新输入中,行(输入中的最后一列)被分配为“大”或“小”(每行三个)。
我想用 2 个或更多 TRUE 计算每列的“小”和“大”的数量。
查找具有 2 个或更多 TRUE 的列的代码(我知道下面的代码忽略输入的第一列):
awk -vtc=2 'NR==1{next};
NR==2{for(i=2;i<=NF;i++){t[i]=0}};
{for(i=2;i<=NF;i++){if($i=="TRUE"){t[i]++}}}
END{
for(j in t)
if(t[j]>=tc){print(j,t[j])}
}' input.tsv > output.tsv
输入.tsv:
MT MT MT MT MT MT MT MT MT MT
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE
FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE
输出.tsv:
(第一列:列号;第二列:TRUE 数)
3 3
6 3
9 2
10 2
新输入.tsv
MT MT MT MT MT MT MT MT MT MT CAT
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE LARGE
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE SMALL
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE SMALL
FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE SMALL
FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE LARGE
FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE LARGE
所需的输出.tsv:
(第三列:分配为小的 TRUE 数;第四列:分配为大的 TRUE 数)
3 3 2 1
6 3 1 2
9 2 1 1
10 2 0 2
非常感谢任何 linux 向导的帮助!
使用(伪)多维数组的解决方案
awk
或者使用 GNU awk 中可用的真正多维数组
不优雅的大锤,但它似乎工作
输出
编辑
进攻性稍差
awk
这使用了调用不同实用程序的管道: