On Sam, 21 Sep 2002 at 20:17 (+0200), Achim Hoffmann wrote:
On Fri, 20 Sep 2002, Jan Trippler wrote:
cat file|sed -e 's/ü/\\201/g'>file
Noch ein *useless use of cat award* und außerdem überschreibst Du Dir Deine Eingabedatei. Das wird schiefgehen :-(
ok, ich gebe zu dass ich den Sonderfall "Linux *und* bash *und* File ab bestimmter Groesse" nicht getestet habe. Schande ueber mich.
(eine Zeile) jan@P75:~ > echo "über vülen üblen Tüpen würgt üzgüz ürre dürre füsse" >file jan@P75:~ > ll file -rw-r--r-- 1 jan users 52 Sep 21 23:24 file jan@P75:~ > cat file | sed -e 's/ü/\\201/g'>file jan@P75:~ > ll file -rw-r--r-- 1 jan users 0 Sep 21 23:25 file Soviel zum Thema "*und* File ab bestimmter Groesse". Dass in dieser Liste Linux und bash mitnichten einen Sonderfall darstellen, sollte ich Dir wohl noch verraten.
Das heisst aber nicht, dass es prinzipiell falsch ist (siehe unten).
Doch. Du verlässt Dich darauf, dass das Betriebssystem in einer bestimmten Art und Weise reagiert, die Du nicht kennst und auf die Du keinen Einfluss hast.
Das Beispiel mit dem temporaeren File ist in den meisten Faellen (SHELL, OS, grosse Files) das universellste.
So, damit ist gut, der Rest ist off-topic.
Achim
=========================================================================== Nachdem ich nun einen Award gewonnen habe, muss ich natuerlich auch eine Rede halten, wer sich dabei durch meine bissigen und/oder sarkastischen Bemerkungen angesprochen fuehlt, ist **selbstverstaendlich** gemeint ;-)
Aus Deinen nachfolgenden Auslassungen habe ich nur verstanden, dass Du Dich fürchterlich auf den Schlips getreten fühlst und ich weiss ehrlich gesagt nicht, warum. Dein vorgeschlagener Weg funktioniert nicht, der Anwender Deiner Befehlsfolge riskiert Datenverlust. Darf ich darauf nicht hinweisen?
Vielleicht bin ich einfach zu alt fuer so moderne Sachen wie Linux und bash und GHz-CPUs, etc., das "cat file|sed ... >file" Beispiel benutze ich seit Jahren mit csh auf SunOS, und es funktioniert (auch Files >> 10MB).
Du benutzt seit Jahren eine Konstruktion, die nur unter bestimmten Umständen funktioniert. Mein Test lief übrigens nicht auf einer GHz-CPU und dass wir hier von Linux reden, liegt wohl in der Natur dieser ML. Zur Info: Der obige Ausschnitt entstand auf einem Pentium 75 MHz, Kernel 2.2.10, 48 MB RAM. Gleiches Ergebnis auf AMD K6-2 500 MHz, Kernel 2.4.18, 512 MB RAM. Wenn gewünscht, reiche ich gerne noch Testergebnisse von 486 DX33, K6 233 und P4 1,4 GHz nach. [...]
Ich unterstelle dem Schreiber einfach, dass er den Trick nicht verstanden hat. Schade, aber gut ich hatte es ja auch nicht explizit erklaert.
Korrekt, diesen *Trick* habe ich nicht verstanden. Es ist IMHO falsch, auch wenn Du jetzt viele Zeilen auf einen Erklärungsversuch verwendet hast. Ich schreibe nun mal nicht in eine Datei, die ich zum Lesen geöffnet habe! Auf die Arbeitsweise von cat, Pipe und sed hast Du in der Shell keinen Einfluss, also solltest Du auch defensiv arbeiten, so dass derartige Implementierungs-Details keinen Einfluss auf Dein Ergebnis haben.
Einen *useless ... award* fuer eine funktionierende (Sonder-)Loesung, muss ich den jetzt zurueckgeben? :-]]
Herrjeh, wenn es Dich so wurmt, betrachte meine Mail als nicht geschrieben und mache mit Deiner (Sonder-)Loesung weiter, bis Du mal richtig auf die Nase fällst.
Gut, wo wir schon bei Awards sind, dann koennte man noch den *Don't KISS Award* verleihen. Und zwar fuer dieses Konstrukt:
for f in `seq 1 10000`;do echo 'text'>>file;done
Ohne lange nachzudenken wuerde ich das so schreiben:
#----------- perl -e 'print "text\n"x10000;'>file
awk 'BEGIN{for(i=1;i<=10000;i++){print "text"}}'>file
csh -c 'repeat 10000 echo "text"'>file #-----------
Es scheint Dich glücklich zu machen, also her damit. Ich werde allerdings auch in Zukunft für das Aufbauen von Testdaten weder perl noch awk anschmeissen noch meine Standard-Shell wechseln. Da ich solche Testdateien in der Regel nicht mehr als einmal pro Monat brauche, sind mir die Ausführungszeiten sch***egal - sorry. Ich nehme dann einfach das erste, was mir in die Finger kommt. Du wirst jetzt wahrscheinlich vor Entsetzen aufschreien, aber ich habe auch schon grafische Editoren zu diesem Zweck benutzt - huch!
Entscheident ist, dass alle Losungen min. Faktor 5 (csh) bis 50 (perl) schneller sind; und das ohne das System nennenswert zu belasten (nur I/O). Wird aus 10000 jedoch 10000000, dann wird's spannend (ausreichend swap vorausgesetzt): perl und awk schaffen es immer noch in weniger als 1 Minute, aber das "for .. seq .." Beispiel haengt mit grosser Wahrscheinlichkeit den Rechner auf. Klasse.
<Ironie> Ich bitte noch mal vielmals um Vergebung, dass ich beim Erzeugen der Testdatei, die das Nichtfunktionieren Deiner Lösung zeigt, so nachlässig war, nicht die perfekteste Version zu wählen. Beim nächsten Mal werde ich Dich natürlich vorher konsultieren. </Ironie> Jan