Ich habe zwei Dateien und ein Shell-Skript.
Datei 1:
Batman
Superman
John Snow
Jack Sparrow
Rob Stark
Datei 2:
Batman
Ironman
Superman
Spiderman
John Snow
Arya Stark
Jack Sparrow
Rob Stark
The hound
Skript:
#!/bin/bash
sort ~/Desktop/file1.txt > ~/Desktop/fileA.txt
sort ~/Desktop/file2.txt > ~/Desktop/fileB.txt
diff -y ~/Desktop/fileA.txt ~/Desktop/fileB.txt > ~/Desktop/diff.txt
Das Skript läuft einwandfrei, die Ausgabe ist:
> Arya Stark
Batman Batman
> Ironman
Jack Sparrow Jack Sparrow
John Snow John Snow
Rob Stark Rob Stark
> Spiderman
Superman Superman
> The hound
Ich möchte aber, dass die Ausgabe automatisch lautet:
File A File B
> Arya Stark
Batman Batman
> Ironman
Jack Sparrow Jack Sparrow
John Snow John Snow
Rob Stark Rob Stark
> Spiderman
Superman Superman
> The hound
Was ist die beste Möglichkeit, dies nur mit dem Diff-Befehl zu erreichen?
Antwort1
Sie könnten Ihren Ansatz auf verschiedene Weise verbessern. Wenn Sie jedoch alles beim Alten lassen möchten, müssen Sie lediglich eine weitere Zeile zu Ihrem Skript hinzufügen und dann die letzte Zeile anhängen ( >>
) anstatt zu überschreiben:
#!/bin/bash
echo -e "FileA\t\t\t\t\t\t\t\tFileB" > diff.txt
sort ~/Desktop/file1.txt > ~/Desktop/fileA.txt
sort ~/Desktop/file2.txt > ~/Desktop/fileB.txt
diff -y ~/Desktop/fileA.txt ~/Desktop/fileB.txt >> ~/Desktop/diff.txt
Eine bessere Möglichkeit, dies zu schreiben, wäre
#!/usr/bin/env bash
file1="$1"
file2="$2"
printf "%-36s%36s\n" "FileA" "FileB"
diff -y <(sort "$file1") <(sort "$file2")
Und dann ausführen mit:
script.sh file1.txt file2.txt > diff.txt
Dadurch wird die Erstellung unnötiger temporärer Dateien vermieden und die Dateinamen müssen nicht fest im Skript codiert werden.
Wenn Sie alternativ die tatsächlichen Dateinamen anzeigen möchten, ändern Sie den printf
obigen Aufruf in
printf "%-36s%36s\n" "$file1" "$file2"