否定CSV模式的AWK解决方案

时间:2019-03-01 07:45:17

标签: awk text-processing

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

尝试过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 

较旧的帖子不起作用的原因是数字列更多。我在忽略它们时的错误。

2 个答案:

答案 0 :(得分:2)

不过,不清楚,通过查看示例并尝试编写此代码。您能否请尝试以下操作(也仅通过提供的示例进行了测试)。

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

需要注意的几点:

1-为了安全起见,我从Pattern_file和Input_file的第二字段的每一行的最后删除了空格(如果它们不存在,则可以从上面的代码中删除sub(/[[:space:]]+$/,"")sub(/[[:space:]]+$/,"",$2)。还删除了()[]之类的字符,以避免匹配中出现任何错误(仅在检查条件时,会在其中打印实际内容)。

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

3-如果未设置标志似乎找不到匹配项,则从Input_file打印内容。

答案 1 :(得分:2)

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

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