Grep non può gestire che molte domande, e in quel volume, non sarà aiutato dal fissa il grep -f
bug che lo rende così insopportabilmente lento.
Sia file1 sia file2 sono composti da una parola per riga? Ciò significa che siete alla ricerca di corrispondenze esatte, che possiamo facciamo molto velocemente con awk
:
awk 'NR == FNR { query[$0] = 1; next } query[$0]' file1 file2
NR (numero di record, il numero di riga) è pari solo al FNR (numero specifico di file record) per il primo file, dove compiliamo l'hash e quindi passiamo alla riga successiva. La seconda clausola controlla l'altro file (s) per se la riga corrisponde a uno salvato nel nostro hash e quindi stampa le linee corrispondenti.
In caso contrario, sarà necessario iterare:
awk 'NR == FNR { query[$0]=1; next }
{ for (q in query) if (index($0, q)) { print; next } }' file1 file2
Invece di limitarsi a controllare l'hash, dobbiamo ciclo attraverso ogni query e vedere se corrisponde la riga corrente ($0
). Questo è molto più lento di, ma sfortunatamente necessario (anche se stiamo almeno corrispondendo alle semplici stringhe senza usare espressioni regolari, quindi potrebbe essere più lento). Il ciclo si interrompe quando abbiamo una corrispondenza.
Se si desidera effettivamente valutare le righe del file di query come espressioni regolari, è possibile utilizzare $0 ~ q
anziché il più veloce index($0, q)
. Si noti che questo utilizza POSIX extended regular expressions, più o meno lo stesso di grep -E
o egrep
ma senza bounded quantifiers ({1,7}
) o GNU extensions per word boundaries (\b
) e shorthand character classes (\s
, \w
, ecc).
Questi dovrebbero funzionare finché l'hash non supera quello che può essere memorizzato awk
. Questo potrebbe essere basso come 2.1B voci (un'ipotesi basata sul più alto firmato a 32 bit int) o alto come la memoria libera.
È possibile utilizzare il comando 'split' per dividere file1 in pezzi? –
I comandi SQL generalmente non ti aiutano con i file raw. – likeitlikeit
@DanPichelman se ha diviso il file di pattern in 100 pezzi, deve giocare con il mostro 45G 100 volte..questo è ok ... ** E ** deve rimuovere le linee corrispondenti duplicate. da grep -f fa "OR" .... Non so se è più veloce. – Kent