Schleifen über Wertepaare in bash

8

Ich habe 10 Textdateien und ich möchte paste jede Datei mit ihrem Paar, so dass ich insgesamt 5 Dateien habe.

Ich habe Folgendes versucht:

%Vor%

Dieser Code kombiniert jedoch jede mögliche Kombination, anstatt nur die passenden Paare zu kombinieren.

Ich möchte also, dass die Datei 4_1.txt mit 4_2.txt , 5_1.txt mit 5_2.txt usw. gepaart wird.

    
Rish 25.02.2015, 17:12
quelle

4 Antworten

6

Wenn Sie eine Variable verwenden und ausführen und mit ihr arbeiten möchten, müssen Sie nur eine Schleife verwenden:

%Vor%

Dies wird

tun %Vor%     
fedorqui 25.02.2015, 17:14
quelle
13

Ich stimme der Antwort zu, die fedorqui derzeit im Zusammenhang mit der derzeit gestellten Frage vorschlägt. Das Folgende wird nur gegeben, um allgemeinere Antworten zu geben.

Ein weiterer allgemeiner Ansatz (für bash 4.0 oder neuer) besteht darin, Ihre Paare in einem assoziativen Array zu speichern:

%Vor%

Ein anderer (kompatibel mit älteren Versionen von bash) ist die Verwendung von mehr als einem konventionellen Array:

%Vor%     
Charles Duffy 25.02.2015 17:23
quelle
2

Sie können ein Wörterbuch / hashMap verwenden:

%Vor%

Auf diese Weise können Sie mit Tupeln (Paaren), "Tripeln" usw. - beliebigen Dictionary / hashMap-Daten arbeiten.

Danksagung: Die Hauptidee stammt aus der großen @ CharlesDuffy-s Antwort.

    
VasyaNovikov 05.03.2018 07:19
quelle
1

Es gibt ein gemeinsames Muster, in dem Sie Paare von Dateien haben, wobei ein Name des Paares leicht von dem anderen abgeleitet werden kann. Wenn die Datei den Namen X hat und die andere Datei Y ist, haben Sie die folgenden häufigen Anwendungsfälle.

  • Für die Umbenennung ist Y X mit einer entfernten Erweiterung und / oder einem Datumsstempel.
  • Beim Transcodieren ist Y X mit einer anderen Erweiterung und vielleicht einem anderen Verzeichnis.
  • Bei vielen Datenanalyseaufgaben teilen X und Y einige Teile des Dateinamens, haben jedoch unterschiedliche Parameter oder Erweiterungen.

All dies eignet sich für das gleiche grobe Code-Skelett.

%Vor%

Der Schlüssel hier ist die Beobachtung, dass y von x mit einigen einfachen Variablensubstitutionen abgeleitet werden kann. Sie durchlaufen also die x -Werte und ermitteln den entsprechenden y -Wert innerhalb der Schleife.

Hier haben wir die in den Shells eingebauten Operatoren ${variable#prefix} und ${variable%suffix} verwendet, um den Wert der Variablen mit einem führenden prefix bzw. einem nachlaufenden suffix zurückzugeben. (Es gibt auch ## und %% , um die längste anstelle der kürzesten möglichen Übereinstimmung zu finden. Der Ausdruck nach # oder % ist ein normales Shell-Glob-Muster.) Dies sollte normalerweise alles sein, was Sie brauchen, obwohl Sie häufig sed oder awk scripts sogar für diesen trivialen Job sehen (wo Sie eigentlich normalerweise versuchen sollten, einen externen Prozess zu vermeiden), sowie natürlich für anspruchsvollere Transformationen.

Wenn Sie x Dateien, die über verschiedene Verzeichnisse verteilt sind, durchlaufen müssen, sollte die Schleife mit etwas wie

beginnen %Vor%

Ein häufig auftretendes Problem in ähnlichen Fragen sind Antworten, die $x und $y nicht richtig angeben. Im Allgemeinen sollte jede Variable, die einen Dateinamen enthält, immer in Anführungszeichen stehen.

Wo X und Y nicht verwandt sind, besteht eine übliche Lösung darin, ein Here-Dokument mit dem Mapping zu durchlaufen:

%Vor%     
tripleee 16.02.2016 14:30
quelle

Tags und Links