AWK使用文件删除csv行

时间:2016-05-18 16:14:02

标签: csv awk

我有以下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 

2 个答案:

答案 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)

  1. IGNORECASE特定于gawk,你可能没有使用gawk。
  2. 你正在测试错误的字段。
  3. 增加数组元素没有任何用处。
  4. 试试这个:

    awk -F, 'NR==FNR{remove[tolower($1)];next}!(tolower($3) in remove)' remove.txt old.csv > new.csv