Gegeben ist eine Text-Datei mit Links, nun soll die in die Bereiche Bilder und "andere" Links gegliedert und sortiert werden und die Domain alleine gelistet werden. (Beispiel siehe unten) Mir fallen nur einige komplizierte Lösungen ein, aber ihr könnt das sicher kürzer. zB cat testlinks.txt | sort -u http://stuff.mit.edu/afs/sipb/project/linux/gif/linux95.blue.gif http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.10 http://www.novell.com/de-de/linux/suse/ http://www.novell.com/de-de/products/desktop/ http://www.novell.com/img/n_nld-buy.jpg # Enthaltene Domains: cat testlinks.txt | gawk -F '/' '{print $1"//"$2$3}' | sort -u http://stuff.mit.edu http://www.kernel.org http://www.novell.com #Bilddateien cat testlinks.txt | egrep "\.jpg|\.gif" #andere Bildformate kommen nicht vor http://www.novell.com/img/n_nld-buy.jpg http://stuff.mit.edu/afs/sipb/project/linux/gif/linux95.blue.gif # Keine Bilder cat testlinks.txt | egrep -v "\.jpg|\.gif" http://www.novell.com/de-de/linux/suse/ http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.10 http://www.novell.com/de-de/products/desktop Ergebnis sollte sein: # alle Nichtbilddateien, beginnend mit der "Hauptdomain" http://stuff.mit.edu http://www.kernel.org http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.10 http://www.novell.com http://www.novell.com/de-de/linux/suse/ http://www.novell.com/de-de/products/desktop #Bilder http://www.novell.com/img/n_nld-buy.jpg http://stuff.mit.edu/afs/sipb/project/linux/gif/linux95.blue.gif Al
Hallo Al, hallo Leute, Am Freitag, 25. Februar 2005 16:56 schrieb Al Bogner:
Gegeben ist eine Text-Datei mit Links, nun soll die in die Bereiche Bilder und "andere" Links gegliedert und sortiert werden und die Domain alleine gelistet werden. (Beispiel siehe unten)
Mir fallen nur einige komplizierte Lösungen ein, aber ihr könnt das sicher kürzer.
Stimmt. Ich rationalisiere gleich mal die vielen Katzen weg (die sollen lieber Mäuse fangen ;-) und verleihe Dir einen dicken useless use of cat award
cat testlinks.txt | sort -u
http://stuff.mit.edu/afs/sipb/project/linux/gif/linux95.blue.gif http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.10 http://www.novell.com/de-de/linux/suse/ http://www.novell.com/de-de/products/desktop/ http://www.novell.com/img/n_nld-buy.jpg
# Enthaltene Domains: cat testlinks.txt | gawk -F '/' '{print $1"//"$2$3}' | sort -u
DOMAINS="`gawk -F '/' '{print $1"//"$2$3}' < testlinks.txt | sort -u`" # alternativ statt gawk: sed 's§^\([^/]*//[^/]*\).*$§\1§' # (sed ist möglicherweise etwas schneller ;-) for domain in $DOMAINS ; do # Falls es Leerzeichen-sicher sein soll, besser # echo "$DOMAINS" | while read domain ; do # verwenden - aber bei Domains sind ja Leerzeichen glücklicherweise # nicht erlaubt ;-) echo "$domain"
#Bilddateien cat testlinks.txt | egrep "\.jpg|\.gif"
egrep "$domain/.*\.(jpg|gif)$" testlinks.txt # man beachte die Verankerung am Zeilenende mit $
# Keine Bilder cat testlinks.txt | egrep -v "\.jpg|\.gif"
egrep "$domain/" testlinks.txt | egrep -v "\.jpg$|\.gif$" # wiederum um $ fürs Zeilenende ergänzt
Ergebnis sollte sein:
done So, wenn Du das von mir geschriebene in ein Shellscript packst, müsste es wie gewünscht funktionieren. Falls Du das Script des öfteren brauchst oder sehr viele Domains in Deiner Liste vorkommen, ist eine Lösung mit awk oder Perl schneller, bei der die URLs erstmal in ein paar Arrays verteilt werden, damit die Liste nicht x-fach gelesen werden muss. Eine weitere Alternative wäre, jeder Zeile (automatisiert) ein Sortierkriterium voranzustellen, bestehend aus Domainname und Ranking. Also etwas in dieser Art: http://www.irgendwas.de a http://www.irgendwas.de/ (Domain) http://www.irgendwas.de b http://www.irgendwas.de/test.htm (nicht-Bilder) http://www.irgendwas.de c http://www.irgendwas.de/x.gif (Bilder) Diese Liste kannst Du dann bequem mit sort bearbeiten und die ersten beiden Spalten anschließend wieder wegkürzen. (Um die ersten beiden Spalten erstmal reinzubekommen, empfiehlt sich sed in Verbindung mit dem Bereichsoperator. Falls Du das wirklich willst, frag ggf. nochmal nach.) Gruß Christian Boltz -- Nicht das ich frei von Paranoia Schueben waere ;), aber wenn Dir das passiert spiel sofort Lotto, bei dem Glueck bekommst Du bestimmt 4 Wochen den 6er mit Superzahl. [Maik Holtkamp in suse-linux]
Am Sonntag, 27. Februar 2005 19:27 schrieb Christian Boltz:
Mir fallen nur einige komplizierte Lösungen ein, aber ihr könnt das sicher kürzer.
Stimmt. Ich rationalisiere gleich mal die vielen Katzen weg (die sollen lieber Mäuse fangen ;-) und verleihe Dir einen dicken useless use of cat award
Lass mich doch einen Preis gewinnen :-) Ansonsten danke. Ich habe wieder was dazu gelernt. Schön langsam fange ich auch bei zeitunkritischen Sachen an, nach effizienteren Lösungen zu suchen. Al
Hallo, Am Sun, 27 Feb 2005, Christian Boltz schrieb:
Am Freitag, 25. Februar 2005 16:56 schrieb Al Bogner:
Gegeben ist eine Text-Datei mit Links, nun soll die in die Bereiche Bilder und "andere" Links gegliedert und sortiert werden und die Domain alleine gelistet werden. (Beispiel siehe unten)
Mir fallen nur einige komplizierte Lösungen ein, aber ihr könnt das sicher kürzer.
Stimmt. Ich rationalisiere gleich mal die vielen Katzen weg (die sollen lieber Mäuse fangen ;-) und verleihe Dir einen dicken useless use of cat award
*g*
cat testlinks.txt | sort -u
http://stuff.mit.edu/afs/sipb/project/linux/gif/linux95.blue.gif http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.10 http://www.novell.com/de-de/linux/suse/ http://www.novell.com/de-de/products/desktop/ http://www.novell.com/img/n_nld-buy.jpg
# Enthaltene Domains: cat testlinks.txt | gawk -F '/' '{print $1"//"$2$3}' | sort -u
DOMAINS="`gawk -F '/' '{print $1"//"$2$3}' < testlinks.txt | sort -u`" # alternativ statt gawk: sed 's§^\([^/]*//[^/]*\).*$§\1§' # (sed ist möglicherweise etwas schneller ;-)
Hier geben sich die beiden nix. Beide liefern bei mir um die 0.05s Laufzeit (bei ~1800 URLS).
for domain in $DOMAINS ; do
Solche Konstruktionen sind oft schlecht. Man sollte sich sehr genau ueberlegen, ob man eine ganze Datei (samt Sonderzeichen) in eine Variable packt. Ausserdem ist $2 ja leer. Besser ist in der Regel: gawk -F '/' '{print $1"//"$3;}' testlinks.txt | sort -u | \ while read domain; do ... done [..]
Falls Du das Script des öfteren brauchst oder sehr viele Domains in Deiner Liste vorkommen, ist eine Lösung mit awk oder Perl schneller, bei der die URLs erstmal in ein paar Arrays verteilt werden, damit die Liste nicht x-fach gelesen werden muss.
Jep. Perl aber erst wenn man wirklich eher viel verwurstet. -dnh -- Studie: Oberweite deutscher Frauen wird immer größer. Ich hab's immer gewusst: Der liebe Gott hat sich was dabei gedacht, als er mir so große Hände gab! (Harald Schmidt)
participants (3)
-
Al Bogner
-
Christian Boltz
-
David Haller