我正在尝试使用 awk
解析一些文件并仅提取与一组正则表达式匹配的记录。所以我试图将正则表达式集传递给 IF
以这种方式有条件:
$ awk 'BEGIN{FS="|"; IGNORECASE=1} NR==FNR{a[$0];next} {for (i in a){ if(i) {print $0}}}' file1.txt file2.txt
这是因为 file1.txt
有我想在 file2.txt
中搜索的正则表达式列表.为方便起见,让我们假设这两个文件如下所示:
$ cat file1.txt
$4 ~ $2 "foo[^.]*" $3
$4 ~ $3 "[^.]*foo" $2
$ 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.|
因此,在这个特定示例中,我的正则表达式试图匹配字段 $2
中的单词和 $3
使用字符串 foo
在同一句话之间和之内(这就是为什么我在字段 [^.]*
中使用 $4
的原因。因为我对 $1
是否出现在 $2
之前或反之亦然不感兴趣(只要它们在同一个中间有 foo
的句子)我有两个匹配两种情况的正则表达式,只应打印第三条记录。
因为我试图在字段 $4
中找到许多模式在许多文件中,我的第一个方法是列出一个列表,但也许还有其他方法可以解决
如有任何帮助和意见,我将不胜感激。
最佳答案
不要。只需在脚本中列出条件即可:
BEGIN {FS="|"; IGNORECASE=1}
$4 ~ $2 "foo[^.]*" $3
$4 ~ $3 "[^.]*foo" $2
假设以上内容存储在文件 foo.awk
中,将其执行为 awk -f foo.awk file2.txt
。
或者可以只用您现有的 file1.txt
执行此操作:
awk -F"|" -v IGNORECASE=1 -f file1.txt file2.txt
顺便说一句,您的正则表达式有问题。我们可以在您确定方法后解决这些问题,但我认为您要表达的是:
$4 ~ ("\\<" $2 "\\>.*\\<foo\\>.*\\<" $3 "\\>")
$4 ~ ("\\<" $3 "\\>.*\\<foo\\>.*\\<" $2 "\\>")
可以组合成:
$4 ~ ( ("\\<" $2 "\\>.*\\<foo\\>.*\\<" $3 "\\>") || ("\\<" $3 "\\>.*\\<foo\\>.*\\<" $2 "\\>") )
如果你愿意的话。
上面是使用 GNU awk 作为单词分隔符。请注意,如果 $2 或 $3 包含 RE 元字符,它可能会失败。
关于regex - AWK - 从文件导入 IF 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28636703/