Comparez deux listes d'URL et imprimez les URL nouvellement ajoutées dans un nouveau fichier

8

Je produis initialement deux fichiers qui contiennent des listes d'URL - je les désignerai comme oldet new. Je voudrais comparer les deux fichiers et s'il y a des URL dans le newfichier qui ne sont pas dans le oldfichier, je voudrais qu'elles soient affichées dans un extra_urlsfichier.

Maintenant, j'ai lu quelques trucs sur l'utilisation de la diffcommande mais d'après ce que je peux en dire, cela analyse également l'ordre des informations. Je ne veux pas que la commande ait un effet sur la sortie. Je veux juste que les URL supplémentaires soient newimprimées dans le extra_urlsfichier, quel que soit l'ordre dans lequel elles sont placées dans l'un des deux autres fichiers.

Comment puis-je faire ceci?

neilH
la source

Réponses:

14

Vous pouvez utiliser la commcommande pour comparer deux fichiers et afficher sélectivement des lignes uniques à l'un ou à l'autre, ou les lignes en commun. Il nécessite le tri des entrées, mais vous pouvez les trier à la volée, en utilisant la substitution de processus.

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

Si vous utilisez une version bashqui ne prend pas en charge la substitution de processus, elle peut être émulée à l'aide de canaux nommés. Un exemple est montré dans Wikipedia .

Barmar
la source
Concis mais efficace - exactement ce qui était nécessaire, un excellent morceau de code pour ce dont j'avais besoin.
neilH
Hmm, mais si l'entrée est triée, alors difffera la même chose, non?
juste
diffmontrera toutes les différences. commvous permet de choisir si vous souhaitez voir les lignes du fichier 1, du fichier 2 ou celles qu’elles ont en commun.
Barmar
Salut Barmar, je ne suis pas sûr que vous allez vérifier cela, mais au cas où, j'ai déplacé ce script sur mon Synology Nas pour l'exécuter à partir de là. Depuis l'exécution de mon script à partir de Synology, j'obtiens maintenant l'erreur de syntaxe: ligne 60: erreur de syntaxe: inattendue "("
neilH
Quelle version de bashfonctionne-t-il? Il peut ne pas prendre en charge la substitution de processus.
Barmar
6

Je voudrais simplement utiliser grep:

grep -vFf old new > extra_urls

Explication

  • -f: indique grepde lire ses modèles de recherche à partir d'un fichier. Dans ce cas old,.
  • -v : indique à grep d'inverser la correspondance, pour afficher uniquement les lignes non correspondantes.
  • -F: indique à grep d'interpréter ses modèles de recherche comme des chaînes, et non comme des expressions régulières. De cette façon, l' .URL correspondra littéralement.

Combinés, ceux-ci font grepimprimer toutes les lignes newqui n'étaient pas dedans old. L'ordre des URL dans le fichier n'est pas pertinent.

terdon
la source
Salut terdon, Merci pour votre contribution. Je viens de tester cela et il a produit un fichier _des "URL supplémentaires" vide malgré qu'il y ait de nouvelles URL dans le "nouveau" fichier.
neilH
@ bms9nmh hmm, c'est étrange. Veuillez modifier votre question pour donner un exemple de vos fichiers d'entrée. Vous pouvez également souhaiter entrer dans la salle de discussion du site où nous pourrons en discuter davantage.
terdon
2
Vous voudrez ajouter -Fdes modèles de texte brut
Glenn Jackman
1

La commande étant importante pour vous, utilisez awk

awk '
    NR == FNR {old[$1]=1; next}
    !($1 in old)
' old new > extra
glenn jackman
la source
1
Salut glen, juste pour clarifier, l'ordre n'est pas important. L'ordre des URL n'est pas un problème, juste la différence entre les deux fichiers, c'est-à-dire les URL supplémentaires. Je ne veux pas la différence pour effectuer la sortie en aucune façon.
neilH
@ bms9nmh: vous pouvez simplement passer > extraà | sort > extra. ou | sort -u > extrasi vous ne souhaitez qu'une nouvelle URL apparaisse une fois dans la sortie, quel que soit le nombre de fois qu'elle est dans l'entrée. L'ordre d'entrée est susceptible d'affecter l'ordre de sortie, sauf si vous effectuez un travail supplémentaire quelque part en cours pour l'empêcher.
Steve Jessop
@steve, meh, commest la meilleure réponse à cette question, mais grep -Fvfc'est bien aussi
glenn jackman
0

J'ai une application appelée meld. Il permet de visualiser les deux (ou trois) fichiers côte à côte, montre les différences et permet une copie sélective de l'un à l'autre ou la suppression de caractères.

Meld peut être installé à partir d'un terminal avec

sudo apt-get install meld 
krazykyngekorny
la source