AWK使用文件删除csv行
我有以下内容: old.csvAWK使用文件删除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
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不起作用,但第二个却起作用。谢谢你的第二个!这是完全可行的!谢谢你的解决方案,我的朋友!这是完全可行的!谢谢你的解决方案,我的朋友!