否定 CSV 的模式的 AWK 解决方案

AWK solution to a pattern negating a CSV

我有一个包含模式列表的文件,必须从与 $5 列(从 $1 开始计算)完全/部分匹配的 CSV 中删除这些模式。

尝试过grep -vwF -f <pattern file> <csv file>

由于某种原因,它不起作用。我需要一个 awk 解决方案。

输入文件:

type|||URL|||Date|||Domain|||Referral URLs|||more columns
1|||https://www.google.com|||1524024000|||google.com|||https://www.google.com||| and more 
2|||www.bwin.hu|||1524024324|||bwin.hu|||http://www.bwin.hu/q=sdlfj||| and more

模式文件可能包含: bwin.huwww.bwin.huhttp://www.bwin.hu

需要输出:

1|||https://www.google.com|||1524024000|||google.com|||https://www.google.com||| and more 

旧的 post 不起作用的原因是有更多的数字列。我忽略它们的错误。

不过不是很清楚,通过查看您的样本并尝试我可以写这个。您能否尝试以下操作(也仅使用您提供的样品进行测试)。

awk '
BEGIN{
  FS="\|\|\|"
}
FNR==NR{
  a[[=10=]]=[=10=]
  next
}
{
  val=
}
{
  flag=""
  for(i in a){
      if(a[i] ~ val){
         flag=1
      }
  }
}
!flag
'  pattern_file  Input_file

需要注意的几点:

1- 为了安全起见,我从 Pattern_file 的每一行的最后和 Input_file 的第二个字段中删除了 space(如果它们不存在,那么您可以删除 sub(/[[:space:]]+$/,"") AND sub(/[[:space:]]+$/,"",) 来自上面的代码。我也删除了像 ()[] 这样的字符以避免匹配中的任何错误(虽然只检查条件,但实际内容将打印在其中)。

2- 我也将整个文件(模式一)保存到一个数组中,然后对于 Input_file 的每一行,我检查它是否与数组中的任何内容匹配,如果匹配则设置标志。

3- 如果未设置标志似乎未找到匹配项,那么打印 Input_file 中的内容。

假设您想要部分字符串匹配:

awk '
BEGIN { FS="[|]{3}" }
NR==FNR { a[[=10=]]; next }
{
  for (str in a) {
      if ( index(,str) ) {
          next
      }
  }
}
1'  pattern_file  Input_file