Come fare una differenza insensibile alla linea (diff) in Linux?


0

Ho due file di testo in cui l'ordine delle righe non ha importanza. Voglio scoprire le linee che sono diverse in un file all'altro. L'uso di diff in linux trova la differenza ma tiene conto anche della modifica delle righe dello stesso testo.

In altre parole, come posso fare una differenza insensibile alla linea?

Risposte:


5

Se i tuoi file non sono troppo grandi, puoi sortprima di diffing.

Quindi qualcosa del genere funzionerebbe:

sort file1 > file1_sorted
sort file2 > file2_sorted
diff file1_sorted file2_sorted

Oppure, come hai scoperto nei commenti, puoi anche farlo in una riga,

diff <(sort file1) <(sort file2)

2

Simile alle diffopzioni è possibile utilizzare il commcomando con le sostituzioni di processo e sort( commrichiede che i file su cui opera siano ordinati). Questo ti permetterebbe di concentrarti solo sulle linee comuni, solo sulle linee che si trovano in un file o nell'altro usando -1per sopprimere le linee solo nel primo file, -2per sopprimere le linee solo nel secondo file o -3per sopprimere le linee in entrambi, in modo da vedere tutte le righe che sono solo nel primo file e non nel secondo che potresti fare

comm -23 <(sort file1) <(sort file2)

ovviamente, se vuoi, puoi anche considerare di usare greplike

grep -vFxf file2 file1

che tratterà le linee file2come schemi e stamperà solo le linee da file1 che non hanno corrispondenze ( -v) quando trattano le linee da ( -f) file2come stringhe fisse ( -F) che devono corrispondere all'intera linea ( -x).

La grepsoluzione ha il vantaggio di non dover ordinare i file, ma controlla solo le linee in uno dei file che non si trovano nell'altro, non in entrambe le direzioni contemporaneamente.


Sottolineo che commnecessita di file ordinati . (Sì, lo dici indirettamente, ma è facile trascurare il modo in cui lo hai definito). Inoltre, commè molto più efficiente per questo scenario di diff. La grepsoluzione può esaurire facilmente la memoria se file2è grande (ingrandimento esponenziale durante la conversione dell'NFA in un DFA), non avevamo una domanda su questo non molto tempo fa.
Dirkt
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.