Ciao francescopi.
Domanda. Devi usare grep obbligatoreamente? Oppure puoi scegliere altre strade a patto di arrivare in tempi brevi alla soluzione del tuo problema (sempre meno di 30 minuti)? Dato che non lo hai specificato poichè hai scritto solo
io devo pulire il file master.csv delle righe con la prima colonna contenente i valori del file confronto
suppongo tu possa utilizzare altre vie. Personalmente quindi risolverei la cosa con uno script in cui carico i contenuti dei due files su di un DB. Utilizzando postgresql nello script ci metterei i comandi:
copy confronto from 'path_to_your_files/confronto.csv';
copy master from 'path_to_your_files/master.csv';
E' chiaro che devi aver predistosto opportunamente le tabelle ed i campi relativi sul DB. A questo punto eseguirei la query sul DB (ovviamente nello script devvi aggiungere la parte di comandi per eseguire la query)
delete from master where nome_prima_clonna IN (select nome_prima_clonna from confronto)
infine
copy (select * from master) to 'path_to_your_files/pulito.csv';
In pratica in questo modo non ho fatto altro che utilizzare un DB al posto di grep o di scrivere in C algoritmi di pattern matching come suggeriva MAW o binary search ecc. per ottimizzare la pulitura del file master.csv dal momento che i DB nascono proprio per fare questo
Se lo fai in postgresql non dovresti impiegare più di 30 secondi per eliminare dai 300.000 record di master.csv i 10.000 record in confronto.csv.
Chiaramente devi creare opportunamente i campi chiave sulle tabelle del DB. L'uso delle 8 CPU è garantito dal SO linux che sceglie su quale CPU sia + opportuno eseguire il singolo processo. A tal proposito puoi darti una lettura qui:
http://archives.postgresql.org/pgsql-admin/2004-03/msg00116.phped ai suoi Follow-Ups
L'unico problema che invece vedrei in un tale approccio, potrebbe essere quello di caricare i files sulle tabelle del DB. Anche dividendo il file master.csv in un multiplo di 8 parti in modo da lanciare gli 8 caricamenti in paralleo in quel caso il collo di bottiglia potrebbe essere rappresentato dall'HD. Potresti migliorarlo con un RAID 1 ma sarebbero comunque tutti test da fare perchè non sapendo l'HW che hai a disposizione è difficile immaginare il tempo necessario per caricare 1 file di 20 mega sulla tabella.