2016-05-18 2 views
0

I以下のcsvファイルを持っている:old.csvAWKの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 

私はこれを試してみたが、それは動作しません。誰も助けることができますか? grep

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

あなたは ''(削除で$ 3) 'に'(削除$ 1)を変更してみてください?実際に '!remove [$ 3]'を実行することができます。大文字小文字の問題がある場合は、 'toupper/lower()'関数があります。 – Kent

答えて

1
  1. IGNORECASEはあなたのgawkを使用することはできません、gawkの固有です。
  2. 間違ったフィールドをテストしています。
  3. 配列要素をインクリメントしても何も役に立ちません。

これを試してみてください:

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

これはボックスの外で動作します!ソリューションのおかげで私の友人! –

2

:ここ

grep -v -i -f remove.txt all.csv 

  • -fは - 、FILEから1行につき1つのパターンを得ます。
  • -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は非常に大きなリストには適していません。それはある種のgiganiticメモリ消費を引き起こしました。また、1番目のAWKは動作しませんが、2番目のAWKは動作します。 2番目のありがとう! –

関連する問題