我有以下csv:
old.csv
irrelevant,irrelevant,Abc@gmail.com,irrelevant
irrelevant,irrelevant,zyx@gmail.com,irrelevant
irrelevant,irrelevant,yZ@yahoo.com,irrelevant
irrelevant,irrelevant,that@email.com,irrelevant
irrelevant,irrelevant,this@email.com,irrelevant
irrelevant,irrelevant,def@gmail.com,irrelevant
irrelevant,irrelevant,anoTher@mydomain.com,irrelevant
我需要从此文件中删除包含电子邮件的行:
remove.txt
abc@gmail.com
yz@yahoo.com
this@email.com
another@mydomain.com
我需要输出为:
new.csv
irrelevant,irrelevant,zyx@gmail.com,irrelevant
irrelevant,irrelevant,that@email.com,irrelevant
irrelevant,irrelevant,def@gmail.com,irrelevant
我试过这个,但它不起作用。有人可以帮忙吗?
awk -F, 'BEGIN{IGNORECASE = 1};NR==FNR{remove[$1]++;next}!($1 in remove)' remove.txt old.csv > new.csv
答案 0 :(得分:2)
使用grep
:
grep -v -i -f remove.txt all.csv
下面,
-f
- 从FILE获取模式,每行一个。-i
- 忽略大小写-v
- 反转匹配使用awk
:
awk -F, 'BEGIN{IGNORECASE=1} NR==FNR{a[$1]++;next} {for(var in a){if($3 ~ var){print}}}' remove.txt all.csv
另一个awk
:
awk -F, 'NR==FNR{a[tolower($1)]++;next} !(tolower($3) in a){print}' remove.txt all.csv
在你的情况下,它不会起作用。因为,
IGNORECASE=1
仅适用于if (x ~ /ab/)
,而不适用于数组索引。
index in array
答案 1 :(得分:1)
试试这个:
awk -F, 'NR==FNR{remove[tolower($1)];next}!(tolower($3) in remove)' remove.txt old.csv > new.csv