regex - AWK - 从文件导入 IF 条件

标签 regex linux bash if-statement awk

我正在尝试使用 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/

相关文章:

regex - Django url 正则表达式命中 url : *./something 的结尾

mysql - bash shell脚本,创建mysql数据库和用户时遇到问题

json - 如何用jq提取一个json值子串

php - 替换双引号内的内容,包括双引号

regex - 保护特定单词,从字符串中删除字母

javascript - 正则表达式获取 <b> 标签之间的内容

python - python 27 对 RHEL5 的依赖

java - 调用外部类和方法

c - 为什么我们的数据包嗅探器不能接收到所有重放的 TCP 数据包?

bash - 从名称获取 bash 函数路径