Awk 如何在至少2列中获取值大于2的行?

Awk 如何在至少2列中获取值大于2的行?,awk,Awk,我试图在至少两列中提取值大于等于2的行。我的输入文件如下所示 gain,top1,sos1,pho1 ATC1,0,0,0 ATC2,1,2,1 ATC3,6,6,0 ATC4,1,1,2 cat input_file | awk 'BEGIN{FS=",";OFS=","};{count>=0;for(i=2; i<4; i++) {if($i!=0) {count++}};if (count>=2){print $0}}' 我的awk脚本是这样的 gain,top1,s

我试图在至少两列中提取值大于等于2的行。我的输入文件如下所示

gain,top1,sos1,pho1
ATC1,0,0,0
ATC2,1,2,1
ATC3,6,6,0
ATC4,1,1,2
cat input_file | awk 'BEGIN{FS=",";OFS=","};{count>=0;for(i=2; i<4; i++) {if($i!=0) {count++}};if (count>=2){print $0}}'
我的awk脚本是这样的

gain,top1,sos1,pho1
ATC1,0,0,0
ATC2,1,2,1
ATC3,6,6,0
ATC4,1,1,2
cat input_file | awk 'BEGIN{FS=",";OFS=","};{count>=0;for(i=2; i<4; i++) {if($i!=0) {count++}};if (count>=2){print $0}}'
这个脚本有什么问题。谢谢

awk -F, 'FNR>1{f=0; for(i=2; i<=NF; i++)if($i>=2)f++}f>=2 || FNR==1' file
输出-1

$ awk -F, 'FNR>1{f=0; for(i=2; i<=NF; i++)if($i>=2)f++}f>=2 || FNR==1' file
gain,top1,sos1,pho1
ATC3,6,6,0
$awk-F,'FNR>1{F=0;对于(i=2;i=2)F++}F>=2 | | FNR==1'文件
增益,top1,sos1,pho1
ATC3,6,6,0
输出-2(相当快)

$awk-F,'FNR>1{F=0;对于(i=2;i=2)F++;如果(F>=2){print;next}}}}FNR==1'文件
增益,top1,sos1,pho1
ATC3,6,6,0
输出-1

$ awk -F, 'FNR>1{f=0; for(i=2; i<=NF; i++)if($i>=2)f++}f>=2 || FNR==1' file
gain,top1,sos1,pho1
ATC3,6,6,0
$awk-F,'FNR>1{F=0;对于(i=2;i=2)F++}F>=2 | | FNR==1'文件
增益,top1,sos1,pho1
ATC3,6,6,0
输出-2(相当快)

$awk-F,'FNR>1{F=0;对于(i=2;i=2)F++;如果(F>=2){print;next}}}}FNR==1'文件
增益,top1,sos1,pho1
ATC3,6,6,0

hacky
awk
,也处理标题

$ awk -F, '($2>=2) + ($3>=2) + ($4>=2) > 1' file

gain,top1,sos1,pho1
ATC3,6,6,0
或者


hacky
awk
,也处理标题

$ awk -F, '($2>=2) + ($3>=2) + ($4>=2) > 1' file

gain,top1,sos1,pho1
ATC3,6,6,0
或者

@巴利语:@try: 希望这应该快得多

awk '{Q=$0;}(gsub(/,[2-9]/,"",Q)>=2) || FNR==1'  Input_file
在这里,我将行的值放入一个名为Q的变量中,然后从Q变量全局替换所有匹配项,然后从2到9再到NULL。然后检查其计数是否大于或等于2,如果其全局替换值大于2或行号为1,则应打印当前行。

@pali:@try: 希望这应该快得多

awk '{Q=$0;}(gsub(/,[2-9]/,"",Q)>=2) || FNR==1'  Input_file

在这里,我将行的值放入一个名为Q的变量中,然后从Q变量全局替换所有匹配项,然后从2到9再到NULL。然后检查它的计数是否大于或等于2,如果它的全局替换值大于2或行号为1,那么它应该打印当前行。

你能为我这样的新手解释一下脚本吗?谢谢。@pali:补充解释你能为我这样的新手解释一下剧本吗?谢谢。@pali:添加了解释您必须将计数器重置为
count=0
。您正在检查
$i=0
而不是
$i>=2
是另一个。必须将计数器重置为
count=0
。您正在检查
$i=0
而不是
$i>=2
是另一个。仅供参考,您可以使用
gsub(/,[2-9]/,“&”)
而不是
{Q=$0;}(gsub(/,[2-9]/,”,Q))
。显然,这种方法只适用于所有数字都是一位数的情况,这是OP在其样本输入中显示的数字。多位数字也将满足条件,因为它将大于阈值(但仍然假设所有正数),仅供参考。您可以使用
gsub(/,[2-9]/,“&”)
而不是
{Q=$0}(gsub(/,[2-9]/,“,”,Q))
。显然,这种方法只适用于所有数字都是单位数的情况,这是OP在其样本输入中显示的数字。多位数也将满足条件,因为它将大于阈值(但仍假定所有正数)
awk '{Q=$0;}(gsub(/,[2-9]/,"",Q)>=2) || FNR==1'  Input_file