我正在使用Linux终端和GAWK完成一项任务,目标是提取正则表达式列表并计算与此表达式相关的基因。GAWK中的“处于”状态
我已经能够设置一个GAWK表达式来为每个正则表达式执行此操作,但是我必须为列表的每个表达式运行它。
有没有什么办法可以像这样设置条件:If(RegExp在RegExpList中)i ++ 1?
我正在使用Linux终端和GAWK完成一项任务,目标是提取正则表达式列表并计算与此表达式相关的基因。GAWK中的“处于”状态
我已经能够设置一个GAWK表达式来为每个正则表达式执行此操作,但是我必须为列表的每个表达式运行它。
有没有什么办法可以像这样设置条件:If(RegExp在RegExpList中)i ++ 1?
你可以声明RegExpList作为数组:
RegExpList["RegExp"] = 1;
,然后用这个语句:
if(c in RegExpList){do something;}
如果c
是RegExp
,病情会是真的。
请参阅gawk manual以供参考。
感谢您的回答。这实际上是有道理的。现在的问题是如何从文件输入中执行此操作。 – Hjorvik
我设法做到这一点是这样的:
gawk 'BEGIN{i=0}
{while ((getline line < "regexpinput.txt") !=FN) RegExpList[line]=1;
if ($4 in RegExpList) i++1}
END{print i}' tabular_file.txt
感谢@nopasara的帮助。
这是使用getline不正确(将在一些失败中转入无限循环 - 请参阅http://awk.freeshell.org/AllAboutGetline),并正在读取表格文件每一行的整个regexp文件,并且正在执行一个字符串比较而不是正则表达式比较和idk什么'i ++ 1'将被解释为,但它是错误的。所以无论你想做什么,都不是这样。 –
可能这是正确的做法:
awk '
NR==FNR{ re = (NR>1 ? re "|" : "") "(" $0 ")"; next }
$0 ~ re { cnt++ }
END { print cnt+0 }
' regexpinput.txt tabular_file.txt
,但如果你发布MCVE我们就会知道。
您目前的解决方案是错误的方法。如果您发布[mcve],包括简洁,可测试的样本输入和期望的输出,那么我们可以帮助您。另外,gawk只是awk的一种风格,如果你有awk问题,那么用awk标记它,而不仅仅是gawk,因为使用gawk标记的人比用awk少得多,这就是为什么现在没有人纠正你的原因。 –