2015-11-18 56 views
0

我有以下腳本清潔egrep參數從當前文件夾中的所有文件的.csv(用於清潔電子郵件列表):擊抑制腳本

#!/bin/bash 
for file in $(find . -name "*.csv"); do 
     echo "====================================================" >> db_purge_log.txt 
     echo "$file" >> db_purge_log.txt 
     echo "----------------------------------------------------" >> db_purge_log.txt 
     echo "Contacts BEFORE purge:" >> db_purge_log.txt 
     wc -l $file | cut -d " " -f1 >> db_purge_log.txt  
     echo " " >> db_purge_log.txt 
     cat $file | egrep -v "marketing" | grep -v -E -i '([0-z])\1{2,}' | uniq | sort -u > tmp_file 
     echo "$file is now clean!" 
     mv tmp_file $file ; 
     echo "Contacts AFTER purge:" >> db_purge_log.txt 
     wc -l $file | cut -d " " -f1 >> db_purge_log.txt 
done 

我想egrep -v "marketing"部分在環上運行一個名爲X.csv的文件,並從中提取所有參數。最終,大約6M聯繫人列表將被另一個6M聯繫人列表所抑制(如果可能,還需要在服務器上執行6M * 6M查詢)。

任何想法如何實現?

+0

所以到位'marketing',你想從文件的內容匹配字符串的?使用'egrep -v -f X.csv'。 – Barmar

+0

[不要用'for'遍歷'find'的輸出](http://mywiki.wooledge.org/DontReadLinesWithFor)。 – chepner

+0

嗨,不工作。這個想法是,在x.csv我有3個電子郵件地址(例如[email protected])=>這3個電子郵件地址需要從我上面的文件中的$文件中刪除。更改爲egrep -v -f x.csv不會那樣做。 –

回答

0

請注意,您的排除列表將需要每行一個模式(電子郵件地址),即從egrep的手冊頁:

-f FILE,--file = FILE 從文件中獲取模式,每一個線。空文件包含零模式,因此不匹配任何內容。

因此,請按照Orr的建議修改您的排除行,但也要確保您的x.CSV文件實際上是每行一個電子郵件地址。此外,這應該最有可能是區分大小寫的,所以,也許是這樣的:

cat $file | egrep -vi -f Excludes.txt | \ 
    grep -v -E -i '([0-z])\1{2,}' | sort | uniq > tmp_file 

根據經驗,我更喜歡使用uniq的功能後排序。

:)
戴爾