我有一个带有模式列表的文件,这些模式必须从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.hu
或www.bwin.hu
或http://www.bwin.hu
需要的输出:
1|||https://www.google.com|||1524024000|||google.com|||https://www.google.com||| and more
较旧的帖子不起作用的原因是数字列更多。我在忽略它们时的错误。
答案 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