2014-02-28 133 views
0

我有兩個文本文件。一個是名稱,電子郵件地址和其他字段的CSV文件。另一個只包含電子郵件地址。有沒有簡單的方法來搜索CSV文件,並只輸出「電子郵件地址列表」文件中沒有匹配的行?在另一個文件(Mac/Linux/Unix命令行)中搜索一個文件的行以部分匹配

如果有人能指引我正確的方向,我很樂意找出答案,併爲他人發佈答案。我的猜測是我需要使用cat和grep來做些事情,但是我的Google搜索(和堆棧溢出搜索)以及命令行上的努力迄今尚未奏效。

雖然我可以輕鬆地在Excel甚至SQL中做同樣的事情,但這將是一個持續的需求,因此shell命令會更好,因爲不需要下載CSV文件的步驟,轉換爲Excel或導入到數據庫中。

預先感謝任何指導 - 克里斯

+1

-v fgrep一樣-f filewithaddresslist filetosearch.csv –

+0

這可能會導致不正確的結果,因爲您沒有將電子郵件地址與CSV中的電子郵件字段進行匹配,而是針對整個CSV行進行匹配 – isedev

+0

我可能會做出錯誤的事情,但該命令的結果輸出d與原始文件完全匹配。 @isedev - 對,我需要在給定行的子集中找不到電子郵件的項目列表。 今天我對此有一個簡單的解決方法,但我希望能夠爲未來編寫腳本。 –

回答

0

您可以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 
+0

該命令對於該fgrep行幾乎即時或超過一小時,具有相同的結果。輸出文件包含每一行。電子郵件字段是第一個,所以我相應地更改了$ 2;但是,有些字段用引號引起來。這可能是問題嗎? 我有一個名爲PreferredEmails.txt(每行包含一個電子郵件地址)和另一個名爲List.csv的文件。 這是命令: awk -F,'NR == FNR {PreferredEmails [$ 0];下一個}!(首選電子郵件中的$ 1)'PreferredEmails.txt List.csv> NewList.csv –

+0

當然,CSV文件: 「電子郵件地址」,「名字」,「姓氏」,MAGE_CUSTOMER_GROUPS,EMAIL_TYPE,MEMBER_RATING,OPTIN_TIME ,OPTIN_IP,CONFIRM_TIME,CONFIRM_IP,LATITUDE,LONGITUDE,GMTOFF,DSTOFF,TIMEZONE,CC,REGION,LAST_CHANGED,LEID,EUID boln @ gmail.com,John,Boln,General,html,2 ,,,「2012-12- 08 21:36:43「,24.148.81.237 ,,,,,,,,」2012-12-08 21:36:43「,57169513,015a8038d1 droobie @ yahoo.com,Larry,Baxter ,, html,2 ,,,「2012-12-12 03:14:15」,69.160.44.110,44.8141000,-68.7786000,-5,-4,America/Montreal,US,ME,「2013-05-22 12:11:24 「,57169677,21e75a3a40' –

+0

電子郵件列表: '[email protected] [email protected] layers @ yahoo.com' 僅供參考我新來張貼在這裏,所以我不知道爲什麼這些都顯示在一行。在該文件中,每個電子郵件地址以CRLF結尾。 –

相關問題