Esiste un'utilità diff che ti consente di escludere le colonne?


6

Ad esempio, ho un file di testo, ogni riga è una stringa lunga. Voglio escludere 2 "segmenti" di questa stringa, diciamo le colonne 1-7 e 20-22. Quindi le 2 righe in basso in basso sarebbero una corrispondenza:

123456789012345678901234567890 
------------------------------
xxxxxxxAAAAAAAAAAAAxxxBBBBBBBB
yyyyyyyAAAAAAAAAAAAyyyBBBBBBBB

So che WinMerge ha un plug-in "IgnoreColumns" ma non ho mai funzionato così. In questo esempio lo rinominerei IgnoreColumns_1-7, 20-22.dll, lo selezionerei nel menu dei plugin e scegliere "Pre-Differ". ma non ha mai funzionato.

Parlerò enormi file che non voglio modificare. Non sono contrario a modificarli in streaming nel confronto con sed o qualcosa del genere, ma preferirei non modificare i file effettivi. Non ho ancora scelto di alimentare sed a diff solo perché speravo in una visione più visiva dei dati.


Il programma è aperto o chiuso quando si rinomina il file? Forse devi riavviare WM o ricaricare i plugin. Ho appena provato WinMerge (versione 2.13.20): mettere ogni riga del tuo campione in un file diverso e diffonderli. Inizialmente WinMerge ha mostrato la differenza, ma una volta caricato il plug-in ha detto che erano identici.
Afrazier

Risposte:


4

Quanto segue funziona su Linux e su Cygwin.

vimdiff <(cut -c8-19,23- file1) <(cut -c8-19,23- file2)

Per qualche motivo su Cygwin, Vim richiede che ogni file sia cambiato dall'inizio della modifica e chiede "[O] K, (L) oad File:". Basta digitare Oogni volta.

Concesso che non riesci a vedere le colonne omesse, ma è un confronto visivo, affiancato.


3

Se vuoi ancora far funzionare il plugin "IgnoreColumns" di WinMerge ... sembra che tu sia vicino. Due note:

  1. Per il tuo esempio, nella MergePluginssottocartella di WinMerge , copia IgnoreColumns.dllin IgnoreColumns_1-7_20-22.dll(senza spazi e usando la sottolineatura anziché la virgola).

  2. Chiudere completamente WinMerge e rieseguirlo, dopo aver posizionato quella DLL. ("Ricarica plug-in" aggiornerà il menu Plug-ins/ Listmenu a discesa, ma non aggiornerà la funzionalità.)

Nota a margine: raccomando una versione "supportata ma non ufficiale" di WinMerge - 2.13.20.12 - che include confronti a 3 vie. Vai a Build non ufficiali di WinMerge e in fondo vedrai la "versione supportata per diff a 3 vie".


1

Proprio come la risposta di Diogo_Rocha, è possibile modificare in anticipo il file per rimuovere le colonne che non si desidera testare, quindi eseguire diff. Ma con solo roba da riga di comando.

Quindi, per il tuo esempio, rimuovendo le 'colonne' 1-7 e 20-22 potresti.

sed 's/.\{7\}\(.\{12\}\).\{3\}\(.*\)/\1\2/' test.txt > test2.txt
diff -u test2.txt whatnot.txt

Modifica: palese ladro della migliore risposta di Garyjohn.

diff -u <(cut -c8-19,23- test1.txt) <(cut -c8-19,23- test2.txt) | less

domanda aggiornata. Ho molti file, quindi la copia sarebbe un problema, ma potrebbe essere la soluzione migliore. ma immagino che la mia domanda originale sia valida: esiste un'utilità diff che lo fa immediatamente?
user39160,

In sostanza la risposta di Garyjohn è ciò di cui hai bisogno. Non è necessario duplicare i file, alimentare i file modificati su stdin su diff o sulla sua versione con vimdiff. E più facile con il taglio piuttosto che con la sed.
Nicholi,

0

Se potessi capire il tuo dubbio, stai cercando di escludere o selezionare colonne specifiche da un file di testo. Se è vero, puoi farlo con l' applicazione textpad . Installalo e apri il tuo file di testo, quindi premi il tasto "Alt" nello stesso momento in cui selezioni colonne specifiche dal tuo testo. Con queste colonne selezionate puoi copiare, tagliare o eliminare ognuna di cui hai bisogno.


domanda aggiornata
user39160
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.