Diffondere due grandi file di testo


32

Ho due file di grandi dimensioni (6 GB ciascuno). Sono indifferenziati, con linefeed ( \n) come separatori. Come posso differli? Dovrebbe impiegare meno di 24 ore.

Risposte:


45

La risposta più ovvia è solo usare il comando diff ed è probabilmente una buona idea aggiungere ad esso il parametro --speed-large-files.

diff --speed-large-files a.file b.file

Citi file non ordinati, quindi forse devi prima ordinare i file

sort a.file > a.file.sorted
sort b.file > b.file.sorted
diff --speed-large-files a.file.sorted b.file.sorted

è possibile salvare la creazione di un file di output aggiuntivo eseguendo il piping dell'output del 2 ° ordinamento direttamente in diff

sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -

Ovviamente questi funzioneranno meglio su un sistema con molta memoria disponibile e probabilmente avrai bisogno anche di molto spazio libero su disco.

Non è chiaro dalla tua domanda se hai provato questi prima. In tal caso, sarebbe utile sapere cosa è andato storto (impiegando troppo tempo, ecc.). Ho sempre scoperto che i comandi stock sort e diff tendono a fare almeno così come i comandi personalizzati a meno che non ci siano alcune proprietà molto specifiche dei file che rendono possibile fare le cose in modo diverso.


2
+1. È possibile omettere tutti i file temporanei con named pipe. Utilizzare mkfifoper creare [ab].file.sortedprima di usarli come output per sort. Metti entrambe le sorts con &in background e usa entrambe le piped come nomi di file per diff.
Krissi,

15
@krissi Puoi anche ottenere lo stesso effetto usando questa sintassi:diff <(command 1) <(command 2)
Michael Mrozek

Grazie ha funzionato. Avevo bisogno di un paio di GB di memoria, ma un'istanza di Amazon EC2 da 16 GB l'ha riparata :)
jonasl,

7
Se qualcuno come me si chiede perché la <(cmd1) <(cmd2)sintassi funzioni (in quanto sembra reindirizzare due volte lo standard input!), Prova echo hello <(cmd1) <(cmd2). Vedrai qualcosa del genere hello /dev/fd/63 /dev/fd/62che improvvisamente lo chiarisce;)
alex

3
Nella mia esperienza, l' --speed-large-filesopzione non aiuta se non si dispone di RAM sufficiente. Inoltre, il pre-ordinamento non è utile se si dispone di una struttura di record multilinea che si desidera conservare. Le opzioni di cui sopra (di @unhammer) sono interessanti, ma l'output da rdiffed bsdiffè piuttosto binario. L'installazione bdiffdalla Casella degli strumenti di Heirloom sembra un'attività dauning (richiede devtools di Heirloom, file di intestazione estinti, ...). Ne vale davvero la pena? Ci sono altre alternative?
Christian Pietsch,

5

Ordinare gli input e dire al diffprogramma che gli input sono ordinati fornirebbe un'enorme velocità. Non ne conosco nessuno diffcon un'opzione del genere, ma commassume un input ordinato e sarà molto più veloce se lo fa abbastanza per i tuoi scopi.


commha funzionato alla grande per questo, non ne avevo mai sentito parlare prima ma apparentemente è in coreutils.
theferrit32
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.