Kombinieren von Zeilen mit Linux-Shell
Hallo.
Ich möchte mit einem Linux-Shell-Skript folgende Aufgabe lösen.
In einer Datei parameter stehen zeilenweise einzelne Parameter.
Diese sollen alle miteinander kombiniert und zeilenweise in die Datei kombi geschrieben werden.
Die Datei mit den Parametern kann man sich als zeilenweise Liste von Parameter 1 - z.B 100 vorstellen.
Also eine belibige Anzahl von Parametern stehen zeilenweise in der Datei parameter ( als Buchstaben/ Zahlenkombination).
Diese zeilenweise stehenden Parameter sollen jetzt alle miteinander im ersten Schritt pärchenweise kombiniert und durch ":" getrennt werden, um alle 2er Kombinationen zu bilden, wobei jede Kombination in eine Zeile der Datei kombi geschrieben werden soll, wobei die Zeilen schematisch bei den 2er Kombinationen dann alle z.B. so aussehen:
para18:para99
wobei hier im Beispiel para18 usw als Platzhalter für die tatsächlichen Werte zu verstehen ist.
Im nächsten Schritt werden aus der Datei parameter wieder alle Inhalte der Zeilen kombiniert, diesmal als 3er Gruppen, also z:B.:
para1:para21:para99
Grundsätzlich sollen also auf jeder Kombinationsebene alle Inhalte der Zeilen der Datei parameter miteinander kombiniert und Zeilenweise in die Datei kombi durch ":" getrennt geschrieben werden.
Optimal ist eine Lösung, bei der ich mit Aufruf des Scripts eine Zahl angeben kann, die als maximale Kombinationstiefe ( also wieviele Parameter maximal in einer Zeile stehen, weil die entsprechenden Gruppen gebildet wurden) ins Programm einfliest.
Also "scriptname 4" bedeutet, das die 2er, 3er und 4er Gruppen gebildet werden sollen.
Alternativ währe auch eine Änderung der Kombinationstiefe über das Editieren einer Variablen.
Da ich im Programmieren nicht so fit bin, möchte ich hier mal nachfragen, ob jemand eine Lösung kennt und zeigt.
Gruß
Estrela
Ich möchte mit einem Linux-Shell-Skript folgende Aufgabe lösen.
In einer Datei parameter stehen zeilenweise einzelne Parameter.
Diese sollen alle miteinander kombiniert und zeilenweise in die Datei kombi geschrieben werden.
Die Datei mit den Parametern kann man sich als zeilenweise Liste von Parameter 1 - z.B 100 vorstellen.
Also eine belibige Anzahl von Parametern stehen zeilenweise in der Datei parameter ( als Buchstaben/ Zahlenkombination).
Diese zeilenweise stehenden Parameter sollen jetzt alle miteinander im ersten Schritt pärchenweise kombiniert und durch ":" getrennt werden, um alle 2er Kombinationen zu bilden, wobei jede Kombination in eine Zeile der Datei kombi geschrieben werden soll, wobei die Zeilen schematisch bei den 2er Kombinationen dann alle z.B. so aussehen:
para18:para99
wobei hier im Beispiel para18 usw als Platzhalter für die tatsächlichen Werte zu verstehen ist.
Im nächsten Schritt werden aus der Datei parameter wieder alle Inhalte der Zeilen kombiniert, diesmal als 3er Gruppen, also z:B.:
para1:para21:para99
Grundsätzlich sollen also auf jeder Kombinationsebene alle Inhalte der Zeilen der Datei parameter miteinander kombiniert und Zeilenweise in die Datei kombi durch ":" getrennt geschrieben werden.
Optimal ist eine Lösung, bei der ich mit Aufruf des Scripts eine Zahl angeben kann, die als maximale Kombinationstiefe ( also wieviele Parameter maximal in einer Zeile stehen, weil die entsprechenden Gruppen gebildet wurden) ins Programm einfliest.
Also "scriptname 4" bedeutet, das die 2er, 3er und 4er Gruppen gebildet werden sollen.
Alternativ währe auch eine Änderung der Kombinationstiefe über das Editieren einer Variablen.
Da ich im Programmieren nicht so fit bin, möchte ich hier mal nachfragen, ob jemand eine Lösung kennt und zeigt.
Gruß
Estrela
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 138164
Url: https://administrator.de/contentid/138164
Ausgedruckt am: 22.11.2024 um 19:11 Uhr
7 Kommentare
Neuester Kommentar
Mahlzeit,
Inputdateiname: paras
Outputdateiname: paras.out
Inputdateiname: paras
Outputdateiname: paras.out
#!/bin/bash
depth=2
infile="paras"
outfile="paras.out"
parout=""
parnum=0
if [ "$#" == "1" ]
then
depth=$1
fi
while read line
do
if [ "$parnum" == "$depth" ]
then
parnum=0
echo "${parout:1}" >> $outfile
parout=""
fi
parout="${parout}:${line}"
((parnum+=1))
done < $infile
exit 0
Hi,
sorry falsch verstanden.
Jetzt auch mit dem gewünschten Ausgabe-Datei-Namen, und Vorsicht: falls die Paras-Datei eine Leerzeile (z.B. am Ende) beinhaltet, wird diese mit verarbeitet.
Voilá:
Grüße
sorry falsch verstanden.
Jetzt auch mit dem gewünschten Ausgabe-Datei-Namen, und Vorsicht: falls die Paras-Datei eine Leerzeile (z.B. am Ende) beinhaltet, wird diese mit verarbeitet.
Voilá:
#!/bin/bash
maxdepth=2
depth=0
tempfile=$(mktemp)
infile="paras"
outfile="kombi"
counter=1
parout=""
if [ "$#" == "1" ]
then
maxdepth=$1
fi
cp -v $infile $tempfile
while [[ $counter -lt $maxdepth ]]
do
((counter+=1))
while read lines
do
while read linet
do
echo "${linet}:${lines}" >> $outfile
done < $tempfile
done < $infile
cp $outfile $tempfile
done
rm $tempfile
exit 0
Grüße
Tach,
aller guten Dinge sind drei:
Jetzt werden alle Zeilen mit "para1:para1" rausgefiltert. Oder sollen auch Zeilen mit "para1:paraX:para1" rausgefiltert werden?
Stören die Zeilen, in denen nicht die maximale Iterationstiefe erreicht wird?
Gute Nacht, bis morgen
aller guten Dinge sind drei:
#!/bin/bash
maxdepth=2
depth=0
tempfile=$(mktemp)
tempfile2=$(mktemp)
infile="paras"
outfile="kombi"
counter=1
parout=""
parnum=0
> $outfile
if [ "$#" == "1" ]
then
maxdepth=$1
fi
cp $infile $tempfile
while [[ $counter -lt $maxdepth ]]
do
((counter+=1))
while read lines
do
while read linet
do
echo "${linet}:${lines}" >> $outfile
done < $tempfile
done < $infile
cp $outfile $tempfile
done
while read line
do
cp $tempfile $tempfile2
> $tempfile
grep -v "${line}:${line}" $tempfile2 >> $tempfile
done < $infile
cp $tempfile $outfile
rm $tempfile
rm $tempfile2
exit 0
Jetzt werden alle Zeilen mit "para1:para1" rausgefiltert. Oder sollen auch Zeilen mit "para1:paraX:para1" rausgefiltert werden?
Stören die Zeilen, in denen nicht die maximale Iterationstiefe erreicht wird?
Gute Nacht, bis morgen