Utilisation de diff sur un long fichier d'une ligne


20

J'ai un fichier qui n'a qu'une ligne. Sa taille est d'environ 20 000 octets.

Le fichier a été modifié et je voulais savoir où.

Je pensais utiliser diff, mais cela me montre la ligne complète, car elle affiche la ligne qui a la différence - mais dans ce cas, c'est la seule ligne du fichier qui présente des différences.

Je voulais donc voir quelle est la différence.

Aucun conseil?



2
avez-vous essayé de le diriger vers fmt (si vous utilisez linux bien sur) vous pouvez faire "fmt -w 50 long.txt | diff"
l1zard

Réponses:


11

En supposant qu'il y ait beaucoup d'espaces, comme dans le texte normal, vous pouvez diviser le fichier en mots et le comparer à un outil de diff normal, par exemple, fondre:

tr -s ' ' '\n' < file1.txt > file1.txt.split
tr -s ' ' '\n' < file2.txt > file2.txt.split
meld file1.txt.split file2.txt.split

1
Semble être la solution la plus simple pour moi. Le problème diff est en soi trivial, mais la plupart des outils (pas seulement diff-tools) ne peuvent pas gérer les longues lignes. Le problème est donc de traiter avec de longues lignes plutôt que de se différencier.
p1100i

4

Je trouverais un diff qui fait des diffs intra-ligne. j'utilise xxdiff sous UNIX. je pense WinMerge ne diff intra-ligne sur Windows.

Les autres réponses sont également bonnes: wdiff ou fragmentation - les limites de segment sont plus faciles à définir si les données sont délimitées, par exemple par un tuyau ou une virgule.


1
FYI, xxdiff segfaults si les lignes sont plus longues que 32 768 caractères ...
ValarDohaeris

3

S'il s'agit d'un problème ponctuel, je créerais des copies des fichiers avec \n caractères insérés tous les 50 caractères, puis diff ces copies. (J'ai choisi 50 parce que cela facilite le calcul, en modifiant le numéro de ligne en offset d'octet dans les fichiers d'origine, mais que je peux ajuster ce réglage en fonction de ce que j'ai trouvé.)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.