首页 > 解决方案 > 否定 CSV 的模式的 AWK 解决方案

问题描述

我有一个包含模式列表的文件,这些模式必须从 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.huOR www.bwin.huORhttp://www.bwin.hu

输出要求:

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

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

标签: awktext-processing

解决方案


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

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:]]+$/,"")AND sub(/[[:space:]]+$/,"",$2)。我还删除了一些字符,()[]以避免匹配中的任何错误(虽然仅检查条件,实际内容将打印在其中)。

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

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


推荐阅读