AWK - 从文件导入 IF 条件

AWK - import IF conditions from file

我正在尝试使用 awk 来解析一些文件并仅提取与一组正则表达式匹配的记录。所以我试图以这种方式将正则表达式集传递给 IF 条件:

$  awk 'BEGIN{FS="|"; IGNORECASE=1} NR==FNR{a[[=10=]];next} {for (i in a){ if(i) {print [=10=]}}}' file1.txt file2.txt

这是因为 file1.txt 有我要在 file2.txt 中搜索的正则表达式列表。为方便起见,让我们假设这两个文件如下所示:

$ cat file1.txt

   ~  "foo[^.]*" 
   ~  "[^.]*foo" 

$ cat file2.txt

  1|this|bar|In this line, bar is before foo|
  2|not|here|Here, foo is before. Not|
  3|First|Second|First comes foo then bar comes second.|

因此,在这个特定示例中,我的正则表达式试图将字段 </code> 和 <code> 中的单词与同一句子之间和内部的字符串 foo 进行匹配(这就是为什么我在字段 </code> 中使用 <code>[^.]*。因为我对 </code> 是否出现在 <code> 之前或反之亦然不感兴趣(只要它们在同一个中间有 foo 的句子)我有两个匹配两种情况的正则表达式,只应打印第三条记录。

因为我试图在许多文件的字段 中找到许多模式,所以我的第一个方法是制作一个列表,但也许还有其他方法

如有任何帮助和意见,我将不胜感激。

不要。只需在脚本中列出条件:

BEGIN {FS="|"; IGNORECASE=1}
 ~  "foo[^.]*" 
 ~  "[^.]*foo" 

假设以上存储在文件foo.awk中,执行为awk -f foo.awk file2.txt.

或者可以只用现有的 file1.txt:

awk -F"|" -v IGNORECASE=1 -f file1.txt file2.txt

顺便说一下,您的正则表达式有问题。我们可以在您确定方法后解决这些问题,但我认为您要表达的是:

 ~ ("\<"  "\>.*\<foo\>.*\<"  "\>")
 ~ ("\<"  "\>.*\<foo\>.*\<"  "\>")

可以组合成:

 ~ ( ("\<"  "\>.*\<foo\>.*\<"  "\>") || ("\<"  "\>.*\<foo\>.*\<"  "\>") )

如果你喜欢。

以上是使用 GNU awk 作为单词分隔符。请注意,如果 $2 或 $3 包含 RE 元字符,它可能会失败。