Weisen Sie diff -y Spaltennamen zu

Weisen Sie diff -y Spaltennamen zu

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 printfobigen Aufruf in

printf "%-36s%36s\n" "$file1" "$file2"

verwandte Informationen