AWK使用文件删除csv行

AWK使用文件删除csv行,csv,awk,Csv,Awk,我有以下内容: 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,irrelevan

我有以下内容:

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
我需要从此文件中删除包含电子邮件的行:

删除.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 

使用
grep

grep -v -i -f remove.txt all.csv
这里,

  • -f
    -从文件中获取图案,每行一个
  • -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 -F, 'NR==FNR{a[tolower($1)]++;next} !(tolower($3) in a){print}' remove.txt all.csv
另一个
awk

awk -F, 'BEGIN{IGNORECASE=1} NR==FNR{a[$1]++;next} {for(var in a){if($3 ~ var){print}}}' remove.txt all.csv
awk -F, 'NR==FNR{a[tolower($1)]++;next} !(tolower($3) in a){print}' remove.txt all.csv
对你来说,这是行不通的。因为

IGNORECASE=1
将仅在(x~/ab/)的情况下使用
,而不使用数组索引

index in array

使用
grep

grep -v -i -f remove.txt all.csv
这里,

  • -f
    -从文件中获取图案,每行一个
  • -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 -F, 'NR==FNR{a[tolower($1)]++;next} !(tolower($3) in a){print}' remove.txt all.csv
另一个
awk

awk -F, 'BEGIN{IGNORECASE=1} NR==FNR{a[$1]++;next} {for(var in a){if($3 ~ var){print}}}' remove.txt all.csv
awk -F, 'NR==FNR{a[tolower($1)]++;next} !(tolower($3) in a){print}' remove.txt all.csv
对你来说,这是行不通的。因为

IGNORECASE=1
将仅在(x~/ab/)
的情况下使用
,而不使用数组索引

index in array
  • IGNORECASE是特定于gawk的,您可能没有使用gawk
  • 你在测试错误的字段
  • 增加数组元素没有任何用处
  • 试试这个:

    awk -F, 'NR==FNR{remove[tolower($1)];next}!(tolower($3) in remove)' remove.txt old.csv > new.csv 
    
  • IGNORECASE是特定于gawk的,您可能没有使用gawk
  • 你在测试错误的字段
  • 增加数组元素没有任何用处
  • 试试这个:

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

    您能否尝试将
    (删除中的$1)
    更改为
    (删除中的$3)
    ?事实上你可以做
    !删除[$3]
    。如果您有大小写问题,则有
    touper/lower()
    功能。您可以尝试将
    (删除时为$1)
    更改为
    (删除时为$3)
    ?事实上你可以做
    !删除[$3]
    。如果您有case问题,则存在
    toupper/lower()
    函数grep命令需要大量工作才能可靠。如果在错误的字段中找到电子邮件地址,它将匹配“able@foo.com“与”capable@foo.com“,会匹配的”able@foo.com“与”able@foolcom.net“等等。。。。当您需要在字段上进行匹配时,只需使用awk即可。@sat grep不适用于非常大的列表。它造成了某种巨大的内存消耗。此外,你的第一个AWK不起作用,但第二个却起作用。谢谢你的第二个!grep命令需要大量工作才能可靠。如果在错误的字段中找到电子邮件地址,它将匹配“able@foo.com“与”capable@foo.com“,会匹配的”able@foo.com“与”able@foolcom.net“等等。。。。当您需要在字段上进行匹配时,只需使用awk即可。@sat grep不适用于非常大的列表。它造成了某种巨大的内存消耗。此外,你的第一个AWK不起作用,但第二个却起作用。谢谢你的第二个!这是完全可行的!谢谢你的解决方案,我的朋友!这是完全可行的!谢谢你的解决方案,我的朋友!