[gelöst] sortieren, brauche anstoss shell

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
ren22

[gelöst] sortieren, brauche anstoss shell

Beitrag von ren22 » 23.12.2016 23:51:31

Hallo,
ich habe eine Liste:

Code: Alles auswählen

line="mc_@_slang mc_@_glib2 mc_@_libssh2 glib2_@_libffi glib2_@_pcre libssh2_@_libgcrypt libgcrypt_@_libgpg-error"
und so sollte das Ergebnis ausschauen:

Code: Alles auswählen

mc
slang
glib2
libffi
pcre
libssh2
libgcrypt
libgpgerror
kann mir wer ein Anstoss Tip geben wie ich am besten anfangen kann, irgendwie fehlt mir gerade das Benzin zum starten, am besten unter bash / shell,

Danke und frohes Fest
Zuletzt geändert von ren22 am 30.12.2016 15:11:09, insgesamt 2-mal geändert.

rodney
Beiträge: 332
Registriert: 09.12.2016 04:15:59

Re: sortieren, brauche anstoss shell

Beitrag von rodney » 24.12.2016 00:14:47

Geht sicher noch besser aber auf die Schnelle (quasi als Zuendfunke):

Code: Alles auswählen

$> line="mc_@_slang mc_@_glib2 mc_@_libssh2 glib2_@_libffi glib2_@_pcre libssh2_@_libgcrypt libgcrypt_@_libgpg-error"
$> echo $line | sed -e 's/_@_/ /g' -e 's/\ /\n/g' | awk '!seen[$0]++'
mc
slang
glib2
libssh2
libffi
pcre
libgcrypt
libgpgerror
$>


Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: sortieren, brauche anstoss shell

Beitrag von heisenberg » 24.12.2016 00:24:18

Code: Alles auswählen

echo -e "${line//_@_/ }" | xargs -n1 echo | sort | uniq
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

ren22

Re: sortieren, brauche anstoss shell

Beitrag von ren22 » 24.12.2016 00:35:15

oh man , ihr seid die besten , ich war schon dabei wieder mal mit kanonen auf spatzen zu schießen, mit meinem Code.
Respekt: vor den Profi's
was macht den euer Code genau ?
:D
frohes Fest euch :D

rodney
Beiträge: 332
Registriert: 09.12.2016 04:15:59

Re: sortieren, brauche anstoss shell

Beitrag von rodney » 24.12.2016 01:12:01

Das

Code: Alles auswählen

echo $line | sed -e 's/_@_/ /g'
(aus meinem Beispiel) und

Code: Alles auswählen

echo -e "${line//_@_/ }"
(von heisenberg) ersetzt die Zeichenkette "_@_" durch ein Leerzeichen. Das Ergebnis wird anschliessend mit

Code: Alles auswählen

(sed) -e 's/\ /\n/g'
bzw

Code: Alles auswählen

xargs -n1 echo
in Zeilen umgebrochen (Leerzeichen wird Zeilenumbruch). Abschliessend werden mit

Code: Alles auswählen

awk '!seen[$0]++'
mehrfach vorhandene Zeilen entfernt oder mit

Code: Alles auswählen

sort | uniq
(koennte auch mittels "sort -u" gemacht werden) erst sortiert und anschliessend mehrfach vorkommende Zeilen entfernt.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: sortieren, brauche anstoss shell

Beitrag von heisenberg » 24.12.2016 01:17:46

(koennte auch mittels "sort -u" gemacht werden) erst sortiert und anschliessend mehrfach vorkommende Zeilen entfernt.
Definitiv! Wieder ein Prozess weniger. Kannte ich noch nicht. Danke!
awk '!seen[$0]++'
Ah. die Default-Action ist print $0. Wusste ich auch noch nicht. Gleich noch etwas gelernt.
Zuletzt geändert von heisenberg am 24.12.2016 01:36:54, insgesamt 1-mal geändert.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: sortieren, brauche anstoss shell

Beitrag von heisenberg » 24.12.2016 01:24:36

ich war schon dabei wieder mal mit kanonen auf spatzen zu schießen.
Vor ein paar Monaten habe ich ein kleines Monitoringplugin geschrieben. ca. 120 Zeilen lua-Code. Dann habe ich eine andere Lösung gesehen: 5 Zeilen mit awk. 8O
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

ren22

Re: sortieren, brauche anstoss shell

Beitrag von ren22 » 24.12.2016 01:28:25

sorry leute, mir ist da ein kleiner Fehler unterlaufen :hail: :hail: :oops: :twisted: :facepalm: :facepalm: :facepalm: , in der Lösung habe ich was vertauscht, heissen sollte es:

mc
slang
glib2
libffi
pcre
libssh2
libgcrypt
libgpgerror

habe es auch in den startthread geändert, sorry, jetzt muss ich mal sehen ob ich anhand eurer Beispiele es auf diese Lösung umbiegen kann XD. Danke

rodney
Beiträge: 332
Registriert: 09.12.2016 04:15:59

Re: sortieren, brauche anstoss shell

Beitrag von rodney » 24.12.2016 01:48:59

ren22 hat geschrieben:... heissen sollte es:

mc
slang
glib2
libffi
pcre
libssh2
libgcrypt
libgpgerror

...
Ich erkenne darin keine Logik (in der Reihenfolge), aber vielleicht erklaerst du uns dein angestrebtes Ziel (wofuer die Ausgabe in genau dieser Reihenfolge benoetigt wird) und es findet sich eventuell eine fuer dich funktionierende Lösung.
Ah. die Default-Action ist print $0. Wusste ich auch noch nicht. Gleich noch etwas gelernt.
Als Lesestoff kann ich zu awk das Standardwerk "The AWK Programming Language" empfehlen. Ist zwar "uralt", fuer mich in Sachen awk aber die besten 200 Seiten die ich zu dem Thema gelesen habe.

ren22

Re: sortieren, brauche anstoss shell

Beitrag von ren22 » 27.12.2016 00:10:08

also ich habe mir folgendes überlegt, so könnte es funktionieren.

Bild
http://fs5.directupload.net/images/161226/k2wfebwt.png
# mc_@_slang
# mc_@_glib2
# mc_@_libssh2
# glib2_@_libffi
# glib2_@_pcre
# libssh2_@_libgcrypt
#libgcrypt_@_libgpg-error

also wenn man den String /Zeilevon mc_@_slang trennt , denn linken und den rechten , dann bekomme ich "mc" und "slang", zuerst schaue ich ob "mc" schon in NeueListe steht, wenn nicht, füge ich "mc" hinzu, danach nehme ich den zweiten wert (rechten) "slang" und schaue in NeueListe ob "slang" schon in NeueListe steht, wenn nicht füge ich "slang" zu NeueListe hinzu, danach suche ich weiter nach "slang" in der BasisListe ob ich weitere vorkommen/Zeilen habe mit "slang", wenn ja, füge den rechten Teil von der gefundenen Zeile in NeueListe hinzu.

Bsp.: Würde bei glib2 so aussehen-> suche nach glib2, gefunden glib2_@_libffi, füge libffi NeueListe hinzu, lösche gefundene Zeile, suche weiter nach glib2, wieder gefunden: glib2_@_pcre, füge pcre NeueListe hinzu, lösche gefunde Zeile, suche weiter nach glib2, nichts gefunden.. springe zur nächsten Zeile in der BasisListe und suche nach libssh2, da ja die Zeilen mit "glib2" zuvor gelöscht wurden und glib2 nicht mehr in der BasisListe vorkommt.

Das ganze hat den Sinn , dass immer der erste Wert der vor dem "_@_" steht, ist das Hauptpaket, die Werte nach _@_ sind die Abhängigkeiten die das Paket benötigt, aber ich benötige das in der richtigen reihen folge. Also, mc benötigt slang,glib2, libssh2, aber wiederum benötigen glibs2, libffi und pcre, und libssh2 benötigt libgcrypt, libgcrypt benötigt aber wiederum libgpg-error.. ich hoffe man kann es ein wenig verstehen. So mal sehen wie ich das hinbekommen , wird bestimtm ein: auf Kanonen mit Spatzen schießen von meiner Coding Seite her :D

Danke

ren22

Re: sortieren, brauche anstoss shell

Beitrag von ren22 » 30.12.2016 01:31:53

ok hier wäre meine Lösung: sicher kann man die ein oder andere Stelle verbessern, aber soweit funktioniert erstmal das gewünschte :)

Code: Alles auswählen

#!/bin/sh


Liste="mc_@_slang mc_@_glib2 mc_@_libssh2 glib2_@_libffi glib2_@_pcre libssh2_@_libgcrypt libgcrypt_@_libgpg-error"
NeueListe=""

#run till Liste is zero
while [ $(echo "${#Liste}") -gt 0 ] ; do

	#get first colum
	firstcolumn=$(echo "$Liste" | awk '{print $1}')
	
	#split colum
	lw="${firstcolumn%_@_*}"
	rw="${firstcolumn#*_@_}"
	

	#add $lw to NeueListe if not exists
	if ! echo "$NeueListe" | grep "$lw" >/dev/null; then
		#echo "add1 lw $lw"
		NeueListe="$NeueListe $lw"
	fi
	
	#add $rw to NeueListe if not exists
	if ! echo "$NeueListe" | grep "$rw" >/dev/null; then
		#echo "add1 rw $rw"
		NeueListe="$NeueListe $rw"
		
	#delete first field from $Liste to prevent double matching
	Liste=$(echo "$Liste" | awk '{$1 = ""; print $0}')

		#search for more Strings in $Liste containing "$rw" 
		for i in $Liste; do
			
			if [ "${i%_@_*}" == "$rw" ]; then
				
				#add ${i#*_@_} to NeueListe
				NeueListe="$NeueListe ${i#*_@_}"
				
				#delete field from $Liste to prevent double matching
				Liste=$(echo "$Liste" | sed 's/'$i'//')
			fi
			
		done
	fi

done

echo "neue Liste: $NeueListe"
Ausgabe:
$neue Liste: mc slang glib2 libffi pcre libssh2 libgcrypt libgpg-error
Ich danke euch alle, für eure tolle Mitarbeit

Antworten