2016-11-03 84 views
1

我正在使用Linux终端和GAWK完成一项任务,目标是提取正则表达式列表并计算与此表达式相关的基因。GAWK中的“处于”状态

我已经能够设置一个GAWK表达式来为每个正则表达式执行此操作,但是我必须为列表的每个表达式运行它。

有没有什么办法可以像这样设置条件:If(RegExp在RegExpList中)i ++ 1?

+0

您目前的解决方案是错误的方法。如果您发布[mcve],包括简洁,可测试的样本输入和期望的输出,那么我们可以帮助您。另外,gawk只是awk的一种风格,如果你有awk问题,那么用awk标记它,而不仅仅是gawk,因为使用gawk标记的人比用awk少得多,这就是为什么现在没有人纠正你的原因。 –

回答

2

你可以声明RegExpList作为数组:

RegExpList["RegExp"] = 1; 

,然后用这个语句:

if(c in RegExpList){do something;} 

如果cRegExp,病情会是真的。

请参阅gawk manual以供参考。

+0

感谢您的回答。这实际上是有道理的。现在的问题是如何从文件输入中执行此操作。 – Hjorvik

0

我设法做到这一点是这样的:

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的帮助。

+0

这是使用getline不正确(将在一些失败中转入无限循环 - 请参阅http://awk.freeshell.org/AllAboutGetline),并正在读取表格文件每一行的整个regexp文件,并且正在执行一个字符串比较而不是正则表达式比较和idk什么'i ++ 1'将被解释为,但它是错误的。所以无论你想做什么,都不是这样。 –

0

可能这是正确的做法:

awk ' 
NR==FNR{ re = (NR>1 ? re "|" : "") "(" $0 ")"; next } 
$0 ~ re { cnt++ } 
END { print cnt+0 } 
' regexpinput.txt tabular_file.txt 

,但如果你发布MCVE我们就会知道。