Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Kombinieren von Zeilen mit Linux-Shell

Frage Entwicklung Batch & Shell

Mitglied: Estrela

Estrela (Level 1) - Jetzt verbinden

13.03.2010, aktualisiert 18:42 Uhr, 3690 Aufrufe, 7 Kommentare

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
Mitglied: Korrn
13.03.2010 um 22:55 Uhr
Mahlzeit,

Inputdateiname: paras
Outputdateiname: paras.out

01.
#!/bin/bash 
02.
 
03.
depth=2 
04.
infile="paras" 
05.
outfile="paras.out" 
06.
 
07.
parout="" 
08.
parnum=0 
09.
 
10.
 
11.
if [ "$#" == "1" ] 
12.
then 
13.
	depth=$1 
14.
fi 
15.
 
16.
 
17.
while read line 
18.
do 
19.
	if [ "$parnum" == "$depth" ] 
20.
	then 
21.
		parnum=0 
22.
		echo "${parout:1}" >> $outfile 
23.
		parout="" 
24.
	fi 
25.
 
26.
	parout="${parout}:${line}" 
27.
	 
28.
	((parnum+=1)) 
29.
 
30.
done < $infile 
31.
 
32.
exit 0
Bitte warten ..
Mitglied: Estrela
14.03.2010 um 00:25 Uhr
Hallo Korrn.

Super, danke Dir für Deine Antwort.

Das mit der Kombinationstiefe funktioniert schon einwandfrei.

Nur, wenn ich in der Ausgangsdatei 12 Begriffe stehen habe und jeder mit jedem kombiniert wird, ergibt das bei 2er Gruppen ca. 144 Kombinationen.
In der Ergebnisdatei stehen aber nur drei Zeilen, in der die ersten 9 Begriffe der Ausgangsdatei als 3er ( nach Editierung von depth) Gruppen zeilenweise stehen, die letzten 3 Zeilen der Ausgangsdatei bleiben unberücksichtigt.

Das bedeutet also, das alles funktioniert bis auf das Kombinieren. Gültige Kombinationen sind auch Wiederholung an unterschiedlicher Stelle, also:
para1:para33:para44
para1:para44:para33
para33:para44:para1
usw
sind alles gültige und gewünschte Kombinationen.
Also die Einzigartigkeit bezieht sich auf die Zeile und nicht darauf, das ein Parameter der Ausgangsdatei nur einmal im Ergebnis auftauchen darf.

Währe super, wenn Du das noch mit einbauen kannst.

Danke soweit

und ein schönes Restwochenende

Estrela
Bitte warten ..
Mitglied: Korrn
14.03.2010 um 19:35 Uhr
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á:
01.
#!/bin/bash 
02.
 
03.
maxdepth=2 
04.
depth=0 
05.
tempfile=$(mktemp) 
06.
infile="paras" 
07.
outfile="kombi" 
08.
counter=1 
09.
parout="" 
10.
 
11.
if [ "$#" == "1" ] 
12.
then 
13.
	maxdepth=$1 
14.
fi 
15.
 
16.
cp -v $infile $tempfile 
17.
 
18.
 
19.
while [[ $counter -lt $maxdepth ]] 
20.
do 
21.
	((counter+=1)) 
22.
	while read lines 
23.
	do 
24.
		while read linet 
25.
		do 
26.
			echo "${linet}:${lines}" >> $outfile 
27.
 
28.
		done < $tempfile 
29.
	done < $infile	 
30.
 
31.
	cp $outfile $tempfile 
32.
 
33.
done 
34.
 
35.
rm $tempfile 
36.
 
37.
exit 0
Grüße
Bitte warten ..
Mitglied: Fraenky
15.03.2010 um 14:46 Uhr
Funktioniert.
Bitte warten ..
Mitglied: Estrela
15.03.2010 um 15:16 Uhr
Hallo Korrn.

Funktioniert fast alles wunderbar. Danke Dir dafür.

Nur habe ich eine ungewünschte Auffälligkeit entdeckt.

In der Ergebnisdatei steht auch folgendes:

para1:para1

sowie in 3er Gruppen

para4:para2:para2

Das sollte nicht geschehen, das ein Parameter doppelt in einer Zeile steht.

Kannst Du nicht noch vor dem Schreiben in die Ergebnisdatei mit einem regulären Ausdruck überprüfen, ob ein Parameter mindestens doppelt in der zu schreibenden Zeile vorkommt und
falls ja, die Zeile nicht in Ergebnisdatei schreiben.

Das währe dann very perfect.

Danke auch für Deine Hinweise

und alles Gute wünscht

Estrela
Bitte warten ..
Mitglied: Korrn
15.03.2010 um 22:24 Uhr
Tach,

aller guten Dinge sind drei:
01.
#!/bin/bash 
02.
 
03.
maxdepth=2 
04.
depth=0 
05.
tempfile=$(mktemp) 
06.
tempfile2=$(mktemp) 
07.
infile="paras" 
08.
outfile="kombi" 
09.
counter=1 
10.
parout="" 
11.
parnum=0 
12.
 
13.
> $outfile 
14.
 
15.
if [ "$#" == "1" ] 
16.
then 
17.
	maxdepth=$1 
18.
fi 
19.
 
20.
cp $infile $tempfile 
21.
 
22.
 
23.
while [[ $counter -lt $maxdepth ]] 
24.
do 
25.
	((counter+=1)) 
26.
	while read lines 
27.
	do 
28.
		while read linet 
29.
		do 
30.
			echo "${linet}:${lines}" >> $outfile 
31.
 
32.
		done < $tempfile 
33.
	done < $infile	 
34.
 
35.
	cp $outfile $tempfile 
36.
 
37.
done 
38.
 
39.
 
40.
while read line 
41.
do 
42.
	cp $tempfile $tempfile2 
43.
	> $tempfile 
44.
	grep -v "${line}:${line}" $tempfile2 >> $tempfile 
45.
done < $infile 
46.
 
47.
cp $tempfile $outfile  
48.
 
49.
rm $tempfile 
50.
rm $tempfile2 
51.
 
52.
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
Bitte warten ..
Mitglied: Estrela
16.03.2010 um 13:41 Uhr
Hallo Korrn.

Funktioniert wieder alles bis auf die von Dir angesprochenen Umstände.
Ein Parameter darf nicht 2x in einer Zeile auftauchen. Ist egal, ob er direkt nacheinander oder durch andere Parameter getrennt doppelt auftaucht. Das kann man als Regel so einführen.

Die Zeilen, die nicht die maximale Kombinationstiefe erreichen, dürften wohl die Restzeilen sein und werden dadurch währscheinlich schon von den anderen Kombinationsgruppen kleinerer Größe abgebildet, so das wahrscheinlich eine Doppelung vorliegt und daher die Zeilen nicht auftauchen müssen.

Weiter viel mir bei einem nachträglichen Versuch, die Ergebnisdatei zu sortieren, auf, das bei einer Sortierung durch sort der Gruppenzusammenhang verlohren geht, das bedeutet, das 2er und 3er Gruppen gemischt sortiert werden.
Gut, dem könnte man durch vorherige Trennung der Gruppen mit anschließender seperierter Sortierung begegnen, aber optimal währe sicherlich ein Script, das dieses Vorgehen schon implementiert hat, also zuerst die kleinste Gruppe sortieren, danach die nächsthöhere usw.

Aber wie gesagt, das letztere währe ein Feinschliff, der auch händisch zu umgehen ist, wobei die Vermeidung irgendeiner Dopplung eines Parameters in einer Zeile schon als wichtiger zu betrachten ist.

Nochmal herzlichen Dank

und Gruß

Estrela
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Linux Shell Mailanhang umbenennen
gelöst Frage von ThekiviBatch & Shell2 Kommentare

Hallo Miteinander, ich habe hier eine Linuxmaschine(Debian Variante) mit Postfix laufen. Der Server verarbeitet Dateien und schickt sie per ...

Ubuntu
Ordnerliste unter Linux Shell erstellen
Frage von tHe-jAyUbuntu5 Kommentare

Hallo, ich versuche verzweifelt unter Linux eine Ordnerliste zu erstellen. Mein Ziel ist es, dasselbe Resultat wie mit folgendem ...

Linux
Linux Shell wechseln unter VirtualBox auf Linux Mint
gelöst Frage von TastenklopperLinux2 Kommentare

Hallo geehrte Mitstreiter, seit neuestem Arbeite ich primär mit Linux-Mint. Da ich für diverse Arbeiten VMs benötige und ich ...

Batch & Shell
Batches kombinieren
Frage von stridingBatch & Shell1 Kommentar

Hallo! Ich stehe mal wieder vor einem "Problem", das ich leider nicht gelöst bekomme. Vor einiger Zeit habe ich ...

Neue Wissensbeiträge
Apple

IOS 11.2.1 stopft HomeKit-Remote-Lücke

Tipp von BassFishFox vor 1 TagApple

Das Update für iPhone, iPad und Apple TV soll die Fernsteuerung von Smart-Home-Geräten wieder in vollem Umfang ermöglichen. Apple ...

Windows 10

Windows 10 v1709 EN murkst bei den Regionseinstellungen

Tipp von DerWoWusste vor 1 TagWindows 10

Dieser kurze Tipp richtet sich an den kleinen Personenkreis, der Win10 v1709 EN-US frisch installiert und dabei die englische ...

Webbrowser

Kein Ton bei Firefox Quantum über RDP

Tipp von Moddry vor 1 TagWebbrowser

Hallo Kollegen! Hatte das Problem, dass der neue Firefox bei mir auf der Kiste keinen Ton hat, wenn ich ...

Internet

EU-DSGVO: WHOIS soll weniger Informationen liefern

Information von sabines vor 1 TagInternet4 Kommentare

Wegen der europäische Datenschutzgrundverordnung stehen die Prozesse um die Registrierung von Domains auf dem Prüfstand. Sollte die Forderungen umgesetzt ...

Heiß diskutierte Inhalte
Hardware
Kein Bild mit nur einer bestimmten Grafikkarten - Mainboard Konfiguration
gelöst Frage von bestelittHardware18 Kommentare

Hallo zusammen, ich hatte schon einmal eine ähnliche Frage gestellt. Damals hatte ich genau das gleiche Problem. Allerdings lies ...

Windows Server
RODC kann nicht aus Domäne entfernt werden
Frage von NilsvLehnWindows Server18 Kommentare

HAllo, ich arbeite in einem Universitätsnetzwerk mit 3 Standorten. Die Standorte haben alle ein ESXi Cluster und auf diesen ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...

Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement16 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...