Confronta due elenchi di URL e stampa gli URL appena aggiunti su un nuovo file


8

Inizialmente sto producendo due file che contengono elenchi di URL: mi riferirò a loro come olde new. Vorrei confrontare i due file e se ci sono URL nel newfile che non sono nel oldfile, vorrei che questi fossero visualizzati in un extra_urlsfile.

Ora, ho letto alcune cose sull'uso del diffcomando ma da quello che posso dire, questo analizza anche l'ordine delle informazioni. Non voglio che l'ordine abbia alcun effetto sull'output. Voglio solo che l'URL aggiuntivo sia newstampato sul extra_urlsfile, indipendentemente dall'ordine in cui sono inseriti in uno degli altri due file.

Come posso fare questo?

Risposte:


14

È possibile utilizzare il commcomando per confrontare due file e mostrare selettivamente le linee univoche l'una o l'altra o le linee in comune. Richiede che gli input siano ordinati, ma è possibile ordinarli al volo, usando la sostituzione del processo.

comm -13 <(sort old.txt) <(sort new.txt)

Se si utilizza una versione bashche non supporta la sostituzione del processo, può essere emulata utilizzando le named pipe. Un esempio è mostrato in Wikipedia .


Conciso ma efficace, esattamente ciò di cui avevo bisogno, un eccellente bit di codice per ciò che avevo richiesto.
neilH

Hmm, ma se l'ingresso è ordinato, allora difffarà la stessa cosa, giusto?
solo il

diffmostrerà tutte le differenze. commti permette di selezionare se vuoi vedere le linee dal file 1, file 2 o quelle che hanno in comune.
Barmar,

Ciao Barmar, non sono sicuro che lo controllerai, ma solo in caso, ho spostato questo script sul mio Synology Nas per correre da lì. Da quando eseguo il mio script da Synology ora ricevo l'errore di sintassi: riga 60: errore di sintassi: imprevisto "("
neilH

Quale versione di bashè in esecuzione? Potrebbe non supportare la sostituzione del processo.
Barmar il

6

Vorrei solo usare grep:

grep -vFf old new > extra_urls

Spiegazione

  • -f: dice grepdi leggere i suoi schemi di ricerca da un file. In questo caso old,.
  • -v : dice a grep di invertire la corrispondenza, per stampare solo linee non corrispondenti.
  • -F: dice a grep di interpretare i suoi schemi di ricerca come stringhe, non come espressioni regolari. In questo modo, l' .URL verrà abbinato letteralmente.

Combinati, consentono di grepstampare tutte le righe newche non erano presenti old. L'ordine degli URL nel file è irrilevante.


Ciao terdon, grazie per il tuo contributo. Ho appena provato questo e ha prodotto un vuoto _ extra urls _file nonostante ci siano nuovi url nel "nuovo" file.
neilH

@ bms9nmh hmm, è strano. Si prega di modificare la tua domanda per fare un esempio dei file di input. Potresti anche voler entrare nella chat room del sito dove possiamo discuterne ulteriormente.
terdon

2
Ti consigliamo di aggiungere -Fmodelli di testo in chiaro
glenn jackman,

1

Poiché l'ordine è importante per te, usa awk

awk '
    NR == FNR {old[$1]=1; next}
    !($1 in old)
' old new > extra

1
Ciao glen, solo per chiarire, l'ordine non è importante. L'ordine dell'url non è un problema, ma solo la differenza tra i due file, ovvero l'url aggiuntivo. Non voglio la differenza per effettuare l'output in alcun modo.
neilH

@ bms9nmh: basta solo cambiare > extraa | sort > extra. o | sort -u > extrase desideri che un nuovo URL appaia nell'output una sola volta, indipendentemente da quante volte è presente nell'input. L'ordine di input può influire sull'ordine di output a meno che non si esegua un lavoro extra lungo la strada per impedirlo.
Steve Jessop,

@steve, meh, commè la risposta migliore a questa domanda, anche se grep -Fvfva bene lo stesso
glenn jackman

0

Ho un'applicazione chiamata fusione. Permette di visualizzare i due (o tre) file, fianco a fianco, mostra le differenze e consente la copia selettiva dall'uno all'altro o l'eliminazione di caratteri.

La combinazione può essere installata da un terminale con

sudo apt-get install meld 
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.