Das Ziel des von mir erstellten Skripts ist der Vergleich zweier Dateireihen. Die Dateinamen werden selbst in zwei separaten Dateien gespeichert, einem Pfad pro Zeile. Meine Idee ist, zwei while read
Schleifen zu haben , eine für jede Liste von Dateinamen, aber wie kann ich die beiden Schleifen zusammenmischen?
while read compareFile <&3; do
if [[ ! $server =~ [^[:space:]] ]] ; then #empty line exception
continue
fi
echo "Comparing file - $compareFile"
if diff "$compareFile" _(other file from loop?_) >/dev/null ; then
echo Same
else
echo Different
fi
done 3</infanass/dev/admin/filestoCompare.txt
Ich muss in der Lage sein, Dateien aus zwei verschiedenen Listen gleichzeitig durch zwei Leseschleifen zu vergleichen ... Ist das überhaupt möglich?
bash
shell-script
control-flow
mkrouse
quelle
quelle
diff
.diff
.Antworten:
Sie brauchen keine zwei Schleifen; Sie müssen nur aus zwei Dateien in einer Schleife lesen.
quelle
Methode 1: Verwenden Sie, was Sie wissen
Da Sie bereits wissen, wie man eine Datei durchläuft, können Sie die Dateien kombinieren und dann die kombinierten Dateien verarbeiten. Der Befehl
paste
verbindet zwei Dateien zeilenweise. Es wird ein Tabulator zwischen den Zeilen eingefügt, die aus den beiden Dateien stammen. Bei dieser Lösung wird davon ausgegangen, dass Ihre Dateinamen keine Tabulatoren enthalten. (Sie können das Trennzeichen ändern, müssen jedoch ein Zeichen suchen, das in einem Dateinamen nicht vorhanden ist.)Wenn Sie leere Zeilen überspringen möchten, müssen Sie dies in jeder Datei separat tun, da
paste
möglicherweise eine leere Zeile aus einer Datei mit einer nicht leeren Zeile aus einer anderen Datei abgeglichen wird. Mit können Siegrep
die nicht leeren Zeilen filtern.Beachten Sie, dass bei unterschiedlichen Längen der beiden Dateien eine leere angezeigt wird
$file2
(unabhängig davon, welche Liste zuerst beendet wurde).Methode 2: Schleife über zwei Dateien
Sie können einen Befehl im Zustand der while-Schleife so komplex setzen, wie Sie möchten. Wenn Sie setzen
read file1 <&3 && read file2 <&4
, läuft die Schleife so lange, wie beide Dateien eine Zeile zum Lesen haben, dh bis eine Datei leer ist.Wenn Sie leere Zeilen überspringen möchten, ist dies etwas komplizierter, da Sie die beiden Dateien unabhängig voneinander überspringen müssen. Die einfache Möglichkeit besteht darin, das Problem in zwei Teile zu unterteilen: Überspringen Sie die Leerzeilen aus einer Datei und verarbeiten Sie die nicht leeren Zeilen. Eine Methode zum Überspringen der Leerzeilen besteht darin,
grep
wie oben beschrieben vorzugehen. Achten Sie auf den erforderlichen Abstand zwischen dem<
Umleitungsoperator und dem Operator<(
, der eine Befehlssuspension startet.Eine andere Methode besteht darin, eine Funktion zu schreiben, die sich so verhält,
read
aber leere Zeilen überspringt. Diese Funktion kann durch Aufrufenread
einer Schleife ausgeführt werden. Es muss keine Funktion sein, aber eine Funktion ist der beste Ansatz, um Ihren Code zu organisieren und weil dieser Code zweimal aufgerufen werden muss. In der Funktion gibt${!#}
es eine Instanz des bash-Konstrukts,${!VARIABLE}
das den Wert der Variablen ergibt, deren Name der Wert von istVARIABLE
. hier ist die Variable die spezielle Variable,#
die die Nummer des Positionsparameters enthält, so${!#}
wie der letzte Positionsparameter.quelle
-u
OptionEin Ansatz wäre,
read -ra
statt nur zu verwendenread
. Angenommen, diefilestoCompare.txt
enthaltenen 2 Spalten mit den jeweiligen Dateinamenread -ra
lesen beide Spalten gleichzeitig ein und weisen sie einem Array zu.compareFile
. Auf dieses Array könnte dann zugegriffen werden, so dass der Index 0 die erste Datei und der Index 1 jedes Mal die zweite Datei ist, wenn diewhile
Schleife durchlaufen wird.Beispiel
Angenommen, ich habe diese Datei:
filestoCompare.txt
und sie enthält Folgendes:Der Befehl zum Durchlaufen dieser Datei lautet wie folgt:
Wenn die 2 Dateien in der Tat separate Dateien sind, wie zum Beispiel:
Sie können wie folgt mit dem
paste
Befehl verbunden werden:Hier ist der Inhalt von list1and2:
quelle
join
sie zuerst.paste
zum Verknüpfen der 2 Dateien verwendet wird? Würde dich das dazu bringen, deine Stimme zu widerrufen?