Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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, 3651 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 ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Viren und Trojaner
gelöst WHM cPanel Anti Virensoftware für Linux ? (2)

Frage von xpstress zum Thema Viren und Trojaner ...

Windows Netzwerk
Konfiguration Linux VM in IIS-Manager (10)

Frage von HansWerner1 zum Thema Windows Netzwerk ...

Heiß diskutierte Inhalte
Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

Exchange Server
DNS Einstellung - zwei feste IPs für Mailserver (15)

Frage von ivan0s zum Thema Exchange Server ...