我有一个像下面这样的文本文件,尽管它有很多列。我想提取具有特定比例/数量的 TRUE 值的列名,例如 9 行中有 2 行具有 TRUE 的列(具有 TRUE/FALSE 值)。
或者,最好提取具有至少一定数量(例如 2)的 TRUE 值的列。在上面的示例中,它将是具有 TRUE 值的 2 到可能的 9 行的列。应该可以推广到具有不同行数的文件。
谢谢!
输入文件示例:
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
这是使用 bash挑选出具有足够 实例的列的一种方法:可以对输出进行 grep 搜索,如“3 out of 9”之类的字符串,以获取列号(从 0 开始计数):
扫描所有列并为每列累积“TRUE”的计数。
最后,打印所有等于或大于设定点的列:
执行时(对于您提供的数据):
第 2 列 (MT) 有超过 1 个 TRUE 值:实际上有 3 个。
第 3 列 (group1) 有 2 个 TRUE 值。
第 11 列 (group1.8) 有 1 个 TRUE 值。第 12 列 (group1.9) 有 3 个 TRUE 值。
如果您不提供比例,则默认为 0.3。
该
awk
程序采用一个参数,该参数是显示列标题所需p
的百分比。TRUE
从第一行开始,它将所有列标题保存到数组
cols
中。然后它会总结该单词TRUE
在每一列中出现的次数。最后,它计算TRUE
每列中行的百分比,并将其cp
与 进行比较p
。如果大于给定p
值,则输出列名和百分比。