我需要一个命令来删除文本文件中的任何列,如果它们在列中具有 =>${MaxAllowedNumberOfFs} 'F's(行数不同的列)。
我有一些接近的伪代码,但我不知道如何设置匹配数限制器。
假设限制器设置为 3,示例输入文件为:
F G F H H
G F F F A
F G F F F
F F F T F
那么所需的输出将是:
G H H
F F A
G F F
F T F
接近的伪代码(限制器可以并且将根据文件而改变):
MaxAllowedNumberOfFs="1012"
Count_of_columns=`awk '{print NF}' filename | sort -nr | sed -n '$p'`
for((i=1;i<=$Count_of_columns;i++)); do awk -v i="$i" -v x="$MaxAllowedNumberOfFs" '$i == F =>x number of times {$i="";print $0}' filename; done
显然,我可以使用 grep 遍历所有列,计算列中出现的次数,然后删除不符合条件的列。但这真的很慢。真的想要一个漂亮的 awk 命令,但我没有 awk 技能
一种方法是读取文件两次。第一次计算 F,第二次输出线。所以像
这
NR==FNR
是查看这是我们第一次还是第二次读取文件的技巧。假设文件中有任何行,那么只有在第一次读取文件时才成立。该数组c
是该列中 F 个字符的计数。next
表示第一次读取文件时该行的所有处理都已完成。第二行在第二次读取文件时执行。这是转置 - 线路滤波器 - 转置方法的说明。它可能不适合您的(大文件)案例,但可能对其他人有价值:
然后
尝试使用下面的脚本,它工作正常
输出