Wie kann man nur die erste Zeile zweier Dateien unterscheiden?

17

Ich möchte nur die erste Zeile von zwei Dateien unterscheiden, im Gegensatz zur gesamten Datei. Wie würde ich das machen? Ich brauche nur eine Lösung für die erste Zeile, aber wenn Sie die Anzahl der Zeilen angeben könnten, wäre das eine viel bessere Antwort.

Daher würde diff keine Unterschiede zwischen den folgenden beiden Dateien zurückgeben:

a
1
2

und:

a
3
4
gsingh2011
quelle
hat das für dich geklappt ...?
Nerdwaller
@nerdwaller Yup, akzeptiert.
Gsingh2011
kühle Bohnen. Ich habe versucht, über andere Optionen nachzudenken, zum Glück ist das nicht erforderlich.
Nerdwaller

Antworten:

26

Bitte schön:

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

(Dies würde überhaupt nichts zurückgeben).

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

Returns:
2c2
< 1
---
> 3

Sie könnten das in ein Skript integrieren, um die Dinge zu tun, die Sie erwähnen.

#!/bin/bash

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

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

Um dies zu verwenden, machen Sie das Skript einfach ausführbar mit chmod +x nameofscript.shund führen Sie dann Folgendes aus: Damit ./nameofscript.sh ~/file1 ~/Docs/file2bleibt die Standardanzahl der Zeilen auf 1, wenn Sie eine Nummer am Ende dieses Befehls anhängen möchten.

(Oder Sie können in Ihrem Skript mit -f1 Datei1 -f2 Datei2 -n 1 wechseln, aber ich kann mich nicht mehr an die case-Anweisung dafür erinnern).

headGibt von Anfang an die Anzahl der Zeilen zurück, wie von vorgeschlagen -n. Wenn Sie rückwärts machen wollen, wäre es tail -n ${numLines}(Schwanz macht vom Ende zurück die Anzahl der Zeilen).

Edit 5/10/16:

Dies gilt speziell für Bash (und kompatible Shells). Wenn Sie dies von etwas anderem verwenden müssen:

bash -c 'diff <(...) <(...)'
Nerdwaller
quelle
Wie würde das für rekursives Diff funktionieren, wenn ich zwei Verzeichnisse unterscheiden muss?
Lanoxx
@lanoxx diff -r dir1 dir2für Verzeichnisse, um dies einzuschränken , möchten Sie das wahrscheinlich an etwas anderes weiterleiten . Wenn Sie Einzelheiten haben, öffnen Sie eine neue Frage und geben Sie hier einen Link an.
Nerdwaller
Nun im Grunde die gleiche Frage nur rekursiv: Diff nur (die ersten n Zeilen | alles außer den ersten n Zeilen) für alle Dateien in zwei Verzeichnissen.
Lanoxx
@lanoxx wie gesagt, stelle eine neue Frage und verlinke sie. Dies ist die beste Vorgehensweise für die Superuser-Community, anstatt den Umfang der Fragen anderer Benutzer zu erweitern.
Nerdwaller
1
@Veridian Welche Shell benutzt du? Dies ist bash-spezifisch, daher müssen Sie möglicherweisebash -c "diff <(...) <(...)"
nerdwaller
-1

diff -U (n Zeilen) file1 file2

Andress
quelle
1
Willkommen bei Super User! Können Sie das -UArgument etwas näher erläutern ? :)
Bertieb