否定 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.hu
或 www.bwin.hu
或 http://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
我有一个包含模式列表的文件,必须从与 $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.hu
或 www.bwin.hu
或 http://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