awk - 否定 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.hu
OR www.bwin.hu
ORhttp://www.bwin.hu
输出要求:
1|||https://www.google.com|||1524024000|||google.com|||https://www.google.com||| and more
旧帖子不起作用的原因是有更多的数字列。我忽略它们的错误。
解决方案
虽然不是很清楚,但通过查看您的示例并尝试我可以写这个。您能否尝试以下操作(也仅使用您提供的样品进行测试)。
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 打印内容。
推荐阅读
- google-apps-script - 尝试使用应用脚本删除文件时访问被拒绝的云端硬盘应用
- ssh - 强制 ssh 使用特定算法进行主机识别
- docker - 为什么我的 Docker 容器找不到它应该创建的文件?
- reactjs - React tsParticles(烟花)不起作用
- mysql - 从 VARCHAR (MySQL) 中选择 MIN
- python - 我如何使用 Telethon(Pyton)从电报消息中获取 json
- python - 我可以让我的程序在列表中的变量(所有整数)之间随机选择,并返回变量而不是值吗?
- django - 如何通过编写的查询命令 django rest framework 搜索结果?
- apache-spark - 为什么在我执行 System.exit(-1) 之后,yarn 让 Spark 应用程序保持“运行”状态?
- jestjs - 如何使用 Jest / React 测试 Router.push 选项