如何根据CSV第二列的排除值过滤第一列的订阅者行?
解决方案
你需要先把所有排除列表的邮箱存入哈希表,再遍历全量订阅者列表做匹配,正确命令如下:
# 多行易读版 awk -F ',' 'FNR == NR { # 第一次读文件:把第二列非空的排除邮箱存到哈希表 if (NR > 1 && $2 != "") exclude[$2] = 1 next } # 第二次读文件:输出第一列不在排除哈希表的邮箱 FNR > 1 && !($1 in exclude) { print $1 }' subs.csv subs.csv # 单行精简版 awk -F ',' 'FNR==NR{if(NR>1&&$2!="")e[$2]=1;next}FNR>1&&!($1 in e){print $1}' subs.csv subs.csv
原命令问题说明
你之前的命令只判断了同一行的两列值是否相等,没有把所有排除项汇总存储,跨行的匹配自然识别不到,比如第三行的charles@example.com是全量列表里的,对应排除项在第一行的第二列,原逻辑就过滤不掉。
效果验证
针对你给出的示例文件,上述命令输出结果完全符合预期:
bill@example.com daisy@example.com esther@example.com
如果你的CSV字段存在前后空格,可以在判断前加gsub(/^[[:space:]]+|[[:space:]]+$/,"",$1)和gsub(/^[[:space:]]+|[[:space:]]+$/,"",$2)处理空格即可。
内容的提问来源于stack exchange,提问作者equinoxe5
相关产品推荐
相关产品推荐

