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 元字符,它可能会失败。
我正在尝试使用 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 元字符,它可能会失败。