2016-05-18 145 views
0

我有以下CSV:AWK使用文件,刪除CSV行

old.csv

irrelevant,irrelevant,[email protected],irrelevant 
irrelevant,irrelevant,[email protected],irrelevant 
irrelevant,irrelevant,[email protected],irrelevant 
irrelevant,irrelevant,[email protected],irrelevant 
irrelevant,irrelevant,[email protected],irrelevant 
irrelevant,irrelevant,[email protected],irrelevant 
irrelevant,irrelevant,[email protected],irrelevant 

,我需要刪除含有該文件的電子郵件行:

remove.txt

[email protected] 
[email protected] 
[email protected] 
[email protected] 

而且我需要的輸出是這樣的:

new.csv

irrelevant,irrelevant,[email protected],irrelevant 
irrelevant,irrelevant,[email protected],irrelevant 
irrelevant,irrelevant,[email protected],irrelevant 

我已經試過這一點,但它不工作。誰能幫忙?

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

可以嘗試更改'($ 1刪除)''到(在刪除了$ 3)'?實際上你可以做'!remove [$ 3]'。如果遇到問題,可以使用'toupper/lower()'函數 – Kent

回答

1
  1. IGNORECASE是呆子特有的,你可能不使用GAWK來。
  2. 您正在測試錯誤的字段。
  3. 遞增數組元素沒有用處。

試試這個:

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

這工作正常!感謝您的解決方案,我的朋友! –

2

隨着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

awk -F, 'NR==FNR{a[tolower($1)]++;next} !(tolower($3) in a){print}' remove.txt all.csv 

在你的情況下,它不會工作。因爲,

IGNORECASE=1 

只能在if (x ~ /ab/)上工作,而不能與數組索引一起使用。

index in array 
+0

grep命令需要很多工作才能可靠。它會在錯誤的字段中找到一個電子郵件地址,它將匹配「[email protected]」和「[email protected]」,它會匹配「[email protected]」和「able @ foolcom.net「等等。當你需要匹配一個字段時,只需使用awk。 –

+0

@sat grep不適用於非常大的列表。它引起了某種高級內存消耗。另外,你的第一個AWK不起作用,但是第二個AWK起作用。感謝第二個! –