您可以awk
如下做到這一點:
awk -F, 'NR == FNR {file1[$1]; next} !($2 in file1)' /path/to/file1 /path/to/file2
其中file1
包含是包含電子郵件地址僅file2
是CSV文件中的文件。
的awk
程序加載在陣列中的所有電子郵件地址,然後檢查在file2
第二場具有陣列中的匹配(如果不是,從file2
打印整個相應的線 - 這部分是隱式的)。該程序假定字段分隔符實際上是一個逗號;如果沒有,請使用-F
選項設置實際的分隔符。該程序還假定電子郵件地址存儲在CSV文件的第二個字段中;如果不是,則將$2
更改爲$x
,其中x
是字段編號(從1開始)。
您可能會遇到電子郵件地址列表中的問題,因爲它存儲在內存中的時間很長。
例子:
file1:
email2
email3
file2:
name1,email1,other1,otherother1
name2,email2,other2,otherother2
name3,email3,other3,otherother3
name4,email4,other4,otherother4
output:
name1,email1,other1,otherother1
name4,email4,other4,otherother4
UPDATE:如果CSV可以包含引用電子郵件地址,你應該剝去引號如下:
awk -F, 'NR == FNR {file1[$1]; next}
{ if($2~/^".*"$/) { email=substr($2,2,length($2)-2) } else { email=$2 }
if(!(email in file1)) {print $0} }' /path/to/file1 /path/to/file2
-v fgrep一樣-f filewithaddresslist filetosearch.csv –
這可能會導致不正確的結果,因爲您沒有將電子郵件地址與CSV中的電子郵件字段進行匹配,而是針對整個CSV行進行匹配 – isedev
我可能會做出錯誤的事情,但該命令的結果輸出d與原始文件完全匹配。 @isedev - 對,我需要在給定行的子集中找不到電子郵件的項目列表。 今天我對此有一個簡單的解決方法,但我希望能夠爲未來編寫腳本。 –