Comment différencier uniquement la première ligne de deux fichiers?

17

Je souhaite différencier uniquement la première ligne de deux fichiers, par opposition à l'ensemble du fichier. Comment ferais-je ça? Je n'ai besoin que d'une solution pour la première ligne, mais si vous pouviez spécifier le nombre de lignes, ce serait une bien meilleure réponse.

Diff ne renvoie donc aucune différence entre les deux fichiers suivants:

a
1
2

et:

a
3
4
gsingh2011
la source
Cela a-t-il fonctionné pour vous...?
nerdwaller
@nerdwaller Yup, accepté.
gsingh2011
fèves fraîches. J'essayais de penser à d'autres options, heureusement, ce n'est pas nécessaire.
nerdwaller

Réponses:

26

Voici:

diff <(head -n 1 file1) <(head -n 1 file2)

(cela ne retournerait rien du tout).

diff <(head -n 2 file1) <(head -n 2 file2)

Returns:
2c2
< 1
---
> 3

Vous pouvez l'intégrer dans un script pour faire les choses que vous mentionnez.

#!/bin/bash

fileOne=${1}
fileTwo=${2}
numLines=${3:-"1"}

diff <(head -n ${numLines} ${fileOne}) <(head -n ${numLines} ${fileTwo})

Pour l'utiliser, il suffit de rendre le script exécutable avec chmod +x nameofscript.shpuis de l'exécuter, ./nameofscript.sh ~/file1 ~/Docs/file2cela laisse le nombre de lignes par défaut à 1, si vous voulez ajouter un nombre à la fin de cette commande.

(Ou vous pouvez faire des changements dans votre script avec -f1 file1 -f2 file2 -n 1, mais je ne me souviens pas du haut de ma tête la déclaration de cas pour cela).

headretourne depuis le début le # de lignes comme suggéré par -n. Si vous vouliez faire l'inverse, ce serait tail -n ${numLines}(la queue fait de la fin le nombre de lignes).

Modifier le 5/10/16:

Ceci est spécifique à Bash (et aux shells compatibles). Si vous devez utiliser ceci à partir d'autre chose:

bash -c 'diff <(...) <(...)'
nerdwaller
la source
Comment cela fonctionnerait-il pour les différences récursives lorsque je dois différencier deux répertoires?
lanoxx
@lanoxx diff -r dir1 dir2pour les répertoires, pour le limiter, vous voudrez probablement le rediriger vers autre chose. Si vous avez des détails, ouvrez une nouvelle question et donnez un lien ici.
nerdwaller
Eh bien, fondamentalement, la même question est récursive: Diff uniquement (les n premières lignes | tout sauf les n premières lignes) pour tous les fichiers dans deux répertoires.
lanoxx
@lanoxx comme je l'ai dit, posez une nouvelle question et liez-la. C'est la meilleure pratique pour la communauté des super utilisateurs au lieu d'étendre la portée de la question d'un autre utilisateur.
nerdwaller
1
@Veridian Quel shell utilisez-vous? Ceci est spécifique à bash, vous devrez donc peut-être appelerbash -c "diff <(...) <(...)"
nerdwaller
-1

diff -U (n de lignes) file1 file2

Andress
la source
1
Bienvenue sur Super User! Pouvez-vous développer un peu l' -Uargument? :)
bertieb