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

Mitglied: Estrela

Estrela (Level 1) - Jetzt verbinden

13.03.2010, aktualisiert 18:42 Uhr, 3758 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 ...

Batch & Shell
SQL Befehle über Linux-Shell
gelöst Frage von newit1Batch & Shell4 Kommentare

Hallo Ich will mehrere SQL Befehle über eine Shell ablaufen lassen. Wenn ich die Shell ausführe Öffnet sich nur ...

Batch & Shell
Php in Linux Shell Skript ?
gelöst Frage von newit1Batch & Shell2 Kommentare

Servus, habe das unterstehende geschrieben Ist es möglich das ich den php Code ebenfalls in dem Skript ausführen kann? ...

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 ...

Neue Wissensbeiträge
Windows 7
Updategängelung auf Windows 10, die zweite
Information von Penny.Cilin vor 1 TagWindows 7

Hallo, da Windows 7 im kommenden Jahr nicht mehr supportet wird, werden Nutzer von Window 7 home premium wieder ...

Internet
EU-Urheberrechtsreform: Zusammenfassung
Information von Frank vor 4 TagenInternet1 Kommentar

Auf golem.de gibt es eine Analyse von Friedhelm Greis, der das Thema EU-Urheberrechtsreform gut und strukturiert zusammenfasst. Zwar haben ...

Microsoft Office

Office365 Schwachstellen bei Sicherheit und Datenschutz

Information von Penny.Cilin vor 5 TagenMicrosoft Office7 Kommentare

Auf Heise+ gibt es einen Artikel bzgl. Office365 Schwachstellen. Das ist noch ein Grund mehr seine Daten nicht in ...

Sicherheit
Schwachstellen in VPN Clients
Tipp von transocean vor 7 TagenSicherheit2 Kommentare

Moin, es gibt Sicherheitslücken bei VPN Clients namhafter Hersteller, wie man hier lesen kann. Gruß Uwe

Heiß diskutierte Inhalte
Notebook & Zubehör
Hardware defekt ?
Frage von mausemuckelNotebook & Zubehör14 Kommentare

Hallo und ein schönes Osterfest an alle. Ich benötige mal euer Schwarm wissen. Ich habe hier ein Notebook Lenovo ...

LAN, WAN, Wireless
Lancom und VLANs
Frage von TimmheLAN, WAN, Wireless11 Kommentare

Hallo an alle ich habe momentan ein sehr merkwürdiges problem bei dem ich nicht mehr weiter komme und hoffe ...

Netzwerkmanagement
Konfiguration von IPv6 in einer Domäne mit DHCP
Frage von gnoovyNetzwerkmanagement10 Kommentare

Hi Zusammen, ich bin gerade etwas am verzweifeln. Ich habe eine Testumgebung aufgebaut, um mich in das Thema IPv6 ...

Virtualisierung
Unix System virtualisieren
Frage von BananenmeisterVirtualisierung10 Kommentare

Hallo Zusammen, Ich möchte gerne eine Virtualisierungs-Software auf meinem kleinen ML Server installieren um einige Unix Systeme zu virtualisieren. ...