[GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Nachdenken?! ... wie kommst Du denn bloß auf so abwegige Ideen .. Leute gibts
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Ich hab mir nochmal was ausgedacht (da ich ja keine derartige Abneigung gegen das Denken habe ):
(Extra in whitespacearmer Schnuckelform. )
Code: Alles auswählen
sed 'n;n;s/$/\n/'|fmt|awk '/./{print++i":",$0}'
Use ed once in a while!
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
nice - da hat sich das Denken aber mal gelohnt
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
... kannst dieses abwegige Denk-Ding ja auch mal ausprobieren ... nur so fuer die Erfahrung ... kannst's dann ja auch wieder lassen, wenn's nicht so dein's ist.
Use ed once in a while!
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Hehe, definitiv die kreativste Lösung bisher.Meillo hat geschrieben:04.08.2021 22:36:44Ich hab mir nochmal was ausgedacht (da ich ja keine derartige Abneigung gegen das Denken habe ):
Bei meinen ganzen Dateinamen mit über 80 Zeichen bricht das 3-Namen-in-einer-Zeile aber leider wieder am fmt in der Mitte
Code: Alles auswählen
printf "%080d.viel %080d.zu %080d.lange %080d.Namen" 1 2 3 4 | sed 'n;n;s/$/\n/'|fmt|awk '/./{print++i":",$0}'
Meillo hat geschrieben:03.08.2021 22:17:32Die klammerlose Schreibweise von printf() und die spacelosen String-Verkettungen sind nicht unbedingt ein toller Stil ...
Jaja, normalerweise bin ich großzügiger mit der Formatierung Das passte nur nicht mehr so gut in eine Zeile im Forum.
Hatte das Vergnügen schon bei der Wartung von ein paar CGIs. Nähere Auseinandersetzung mit Perl steht trotzdem mal auf der Todo-Liste.Meillo hat geschrieben:03.08.2021 22:17:32vielleicht solltest du es dann besser mit Perl versuchen.
Nach beruflicher Erfahrung mit einem Bash-basierten, unkontrolliert gewachsenen Backend, das für kleinste Dinge ewig brauchte, bin ich ziemlich dafür sensibilisiert, dass Subshells und Pipelines für jede Kleinigkeit sich irgendwann zeitlich bemerkbar machen. Deshalb der Ehrgeiz, das meiste mit Shell-Builtins oder zumindest möglichst wenigen Werkzeugen zu lösen. Vielleicht verlier ich dabei manchmal die Stärke mancher Helferlein aus den AugenMeillo hat geschrieben:03.08.2021 22:17:32Ich wuerde daher sagen, dass die Aufteilung in zwei Programme eher positiv gewertet werden sollte.
Manchmal bekannt als Just (another) Terminal Hacker.
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Nee blos nicht, beim letzten Mal gab's drei Tage furchtbares KoppwehMeillo hat geschrieben:05.08.2021 11:12:48... kannst dieses abwegige Denk-Ding ja auch mal ausprobieren ... nur so fuer die Erfahrung ... kannst's dann ja auch wieder lassen, wenn's nicht so dein's ist.
@JTH: fmt -w irgendwas ... ka, was da das Maximum ist (MAXINT vermutlich )
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Sollte man erwarten:eggy hat geschrieben:05.08.2021 12:00:17@JTH: fmt -w irgendwas ... ka, was da das Maximum ist (MAXINT vermutlich )
Code: Alles auswählen
~$ fmt -w 2501
fmt: invalid width: ‘2501’: Numerical result out of range
~$ echo Löppt! | fmt -w 2500
Löppt!
Edit: „arbitrary limits“, immer nett
Manchmal bekannt als Just (another) Terminal Hacker.
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Um nochmal etwas ontopic zu bleiben, mir lässt die nl Sache keine Ruhe.
Theoretisch™ sollte das rechtsbündig ohne Spaces ja irgendwie einfach machbar sein, -n in kombination mit -w scheint kaputt, aber wenn oben man statt -w1 z.B -w4 mitgibt geht's in die richtige Richtung. Nur wie kommt jetzt am besten an den jeweils passenden Wert für w?
Meine erste Idee wäre den Wert via ((wc eingabe) mod 3) zu finden, evtl noch mit bc draufkloppen, nur und da hängt es grade noch, wie bekomm ich das seq bzw ls am besten parallel verarbeitet? tee? ... mal etwas liegenlassen und drüber schlafen
(@Meillo: ich hab grad schon überlegt, ob man da was mit namend pipes und parallel basteln könnte ... dieses schreckliche Nachdenken macht alles nur schlimmer )
Code: Alles auswählen
seq 1 3000 | awk '{printf" "$0} NR%3==0{print""}' | nl -s ":" -w1
Meine erste Idee wäre den Wert via ((wc eingabe) mod 3) zu finden, evtl noch mit bc draufkloppen, nur und da hängt es grade noch, wie bekomm ich das seq bzw ls am besten parallel verarbeitet? tee? ... mal etwas liegenlassen und drüber schlafen
(@Meillo: ich hab grad schon überlegt, ob man da was mit namend pipes und parallel basteln könnte ... dieses schreckliche Nachdenken macht alles nur schlimmer )
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Bzgl. `fmt -w': Man muss es ja auch nicht uebertreiben. Doppelte Terminalbreite sollte in so Faellen so gut wie immer ausreichen. Irgendwie soll das Script ja auch einen Sinn haben ... der sich mir bei 2000 Zeichen langen Zeilen irgendwie nicht mehr so ganz erschliesst.
Anfangs hatte ich in meinem Code ein `-w200' drin, hab es dann aber weggelassen, weil ich es nicht unbedingt noetig fand und dachte, dass man das ja dann gleich merkt und in der Manpage problemlos findet.
So wirklich ueberzeugt mich nl nicht. Was ist denn der Sinn von `-w', wenn es die Zahl einfach abschneidet, falls sie zu gross wird? Da verschiebe ich doch lieber das Layout anstatt Information wegzuwerfen. (So wie printf(3) das bei `%3d' auch macht.) Wenn ich mir die Manpage anschaue, dann weiss ich auch nicht recht ... das wirkt vom Stil so un-unix-artig, finde ich.
Waere mal interessant, zu recherchieren wo nl herstammt (also was das Design angeht, wer das entworfen hat, welchen Background die Person hatte, wofuer es geschrieben worden ist). Meine FreeBSD-Manpage sagt, dass es zuerst in SystemV R2 aufgetaucht ist. Das Utility ist sogar in POSIX spezifiziert: https://pubs.opengroup.org/onlinepubs/9 ... es/nl.html
Anfangs hatte ich in meinem Code ein `-w200' drin, hab es dann aber weggelassen, weil ich es nicht unbedingt noetig fand und dachte, dass man das ja dann gleich merkt und in der Manpage problemlos findet.
nl ist ja so 'n neumodisches Ding, das eigentlich niemand braucht, weil man seit 1977 ja `awk '{print NR, $0}'' verwenden kann.eggy hat geschrieben:05.08.2021 12:17:41Um nochmal etwas ontopic zu bleiben, mir lässt die nl Sache keine Ruhe.Theoretisch™ sollte das rechtsbündig ohne Spaces ja irgendwie einfach machbar sein, -n in kombination mit -w scheint kaputt, aber wenn oben man statt -w1 z.B -w4 mitgibt geht's in die richtige Richtung. Nur wie kommt jetzt am besten an den jeweils passenden Wert für w?Code: Alles auswählen
seq 1 3000 | awk '{printf" "$0} NR%3==0{print""}' | nl -s ":" -w1
So wirklich ueberzeugt mich nl nicht. Was ist denn der Sinn von `-w', wenn es die Zahl einfach abschneidet, falls sie zu gross wird? Da verschiebe ich doch lieber das Layout anstatt Information wegzuwerfen. (So wie printf(3) das bei `%3d' auch macht.) Wenn ich mir die Manpage anschaue, dann weiss ich auch nicht recht ... das wirkt vom Stil so un-unix-artig, finde ich.
Waere mal interessant, zu recherchieren wo nl herstammt (also was das Design angeht, wer das entworfen hat, welchen Background die Person hatte, wofuer es geschrieben worden ist). Meine FreeBSD-Manpage sagt, dass es zuerst in SystemV R2 aufgetaucht ist. Das Utility ist sogar in POSIX spezifiziert: https://pubs.opengroup.org/onlinepubs/9 ... es/nl.html
Use ed once in a while!
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Die Debianversion ist aus den coreutils
https://sources.debian.org/src/coreutil ... /src/nl.c/
https://sources.debian.org/src/coreutil ... /src/nl.c/
/* Written by Scott Bartram (nancy!scott@uunet.uu.net)
Revised by David MacKenzie (djm@gnu.ai.mit.edu) */
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Code: Alles auswählen
nl -s ": " -w $(($(w=$(seq 1 1000 | wc -l ); echo ${#w}) -1 )) <(seq 1 1000 | sed 'n;n;s/$/\n/'|fmt | sed '/^$/d' )
Um die Länge von wc -l zu bekommen, wüsste ich jetzt auch nichts anderes als "w" mal kurz in ne Variable zu packen und ${#} zu nutzen, aber da das vernachlässigbar klein bleibt vermutlich egal. Oder gibt's da noch nen anderen bash-only-Weg, den ich grade überseh?
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Es waere vielleicht einfacher, du wuerdest sowas verwenden:
oder auch:
... andererseits schaue ich dir auch gerne bei deinen Denkbemuehungen zu.
Code: Alles auswählen
nl|sed 's/^ *//;s/\t/: /'
Code: Alles auswählen
nl|awk '{$1=$1":"}1'
... andererseits schaue ich dir auch gerne bei deinen Denkbemuehungen zu.
Use ed once in a while!
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Ich finde ja gerne Probleme – mit 9 Einträgen:
Müsste das nicht auch eher
sein? Das ursprüngliche klappt nicht bei z.B. 99 Einträgen.
Code: Alles auswählen
~$ nl -s ": " -w $(($(w=$(seq 1 9 | wc -l ); echo ${#w}) -1 )) <(seq 1 9 | sed 'n;n;s/$/\n/'|fmt | sed '/^$/d' )
nl: invalid line number field width: ‘0’: Numerical result out of range
Code: Alles auswählen
-w $(w=$(($(seq 1 1000 | wc -l) / 3)); echo ${#w})
Die Anzahl nötiger Stellen für die Nummerierung finden, ist doch meist ein Problem, was man bei unbekannter Anzahl Elemente nur durch zweimal durchgehen finden kann.eggy hat geschrieben:05.08.2021 17:14:23Um die Länge von wc -l zu bekommen, wüsste ich jetzt auch nichts anderes als "w" mal kurz in ne Variable zu packen und ${#} zu nutzen, aber da das vernachlässigbar klein bleibt vermutlich egal. Oder gibt's da noch nen anderen bash-only-Weg, den ich grade überseh?
Ich habe das Gefühl, von der ursprünglichen Frage hat sich das mit der investierten Zeit schon etwas entferntMeillo hat geschrieben:05.08.2021 14:07:33Irgendwie soll das Script ja auch einen Sinn haben ... der sich mir bei 2000 Zeichen langen Zeilen irgendwie nicht mehr so ganz erschliesst.
Manchmal bekannt als Just (another) Terminal Hacker.
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
@Meillo:
Nee, nee, das kann ja jeder. Und das mit dem Denken lassen wir mal lieber, dass geht nur nach hinten los.
Ich stell mich heute auch wirklich blöd an ... wc | wc ... awk | awk ... irgendwie drehen wir uns im Kreis
Bleibt aber immer noch: wie bekomm ich die seq Ausgabe zweimal in die Verarbeitung ohne das Zeug in ner Variable zu speichern ... parallel, tee, ... was gibt's in der Richtung denn noch so?
@JTH: der Thread ist doch schon längst gelöst, ab dann darf man doch auch OT rumblödeln, oder? Aber relevanter: für mich ist sowas immer ne gute Gelegenheit mal abwegige Sachen auszuprobieren, dabei lern ich meist Neues/Vergessenes. Solange da keine brauchbare Lösung steht, sollte das in dem Maße natürlich nicht sein, aber hier mit den fertigen Lösungen seh ich da kein Problem ... und ihr habt ja auch beide nen Rotstift am Hut, also notfalls einfach abtrennen und nach Smalltalk schubsen.
edit: JTHs Buchstabenzurückgedreht
Nee, nee, das kann ja jeder. Und das mit dem Denken lassen wir mal lieber, dass geht nur nach hinten los.
Ich stell mich heute auch wirklich blöd an ... wc | wc ... awk | awk ... irgendwie drehen wir uns im Kreis
Code: Alles auswählen
nl -s ": " -w $(($(seq 1 1000 | wc -l | wc -m) - 1)) <(seq 1 1000 | sed 'n;n;s/$/\n/'|fmt | sed '/^$/d' )
@JTH: der Thread ist doch schon längst gelöst, ab dann darf man doch auch OT rumblödeln, oder? Aber relevanter: für mich ist sowas immer ne gute Gelegenheit mal abwegige Sachen auszuprobieren, dabei lern ich meist Neues/Vergessenes. Solange da keine brauchbare Lösung steht, sollte das in dem Maße natürlich nicht sein, aber hier mit den fertigen Lösungen seh ich da kein Problem ... und ihr habt ja auch beide nen Rotstift am Hut, also notfalls einfach abtrennen und nach Smalltalk schubsen.
edit: JTHs Buchstabenzurückgedreht
Zuletzt geändert von eggy am 05.08.2021 18:31:14, insgesamt 2-mal geändert.
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Nee, das ist ein Zeichen fuer die vielfaeltige Nuetzlichkeit des jeweiligen Kommandos.eggy hat geschrieben:05.08.2021 17:51:50... wc | wc ... awk | awk ... irgendwie drehen wir uns im Kreis
Gar nicht, weil man in Unix Pipelines nicht in mehrere Wege auspalten kann (ausser in Dateien abzweigen mit tee). Es ginge wohl nur mit hoeheren FDs und parallelen Prozessen, was aber eher gemogelt ist.Bleibt aber immer noch: wie bekomm ich die seq Ausgabe zweimal in die Verarbeitung ohne das Zeug in ner Variable zu speichern
Ich wuerde den Output in eine Variable puffern und die dann zweimal verwenden. Das scheint mir dafuer die einfachste Loesung zu sein.
Use ed once in a while!
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Klar klar, das war keine Kritik oder Moderation von mir, im Gegenteil. Letzteres geht mir genauso. Nur für den Buchstabendreher da oben muss ich einmal böse gucken.eggy hat geschrieben:05.08.2021 17:51:50@JHT: der Thread ist doch schon längst gelöst, ab dann darf man doch auch OT rumblödeln, oder? Aber relevanter: für mich ist sowas immer ne gute Gelegenheit mal abwegige Sachen auszuprobieren, dabei lern ich meist Neues/Vergessenes.
Manchmal bekannt als Just (another) Terminal Hacker.
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
@JTH: Hat ich auch nicht so verstanden. Und die Buchstaben sind auch schon wieder richtig gedreht... naja, bis zum nächsten Mal, ich kann mir die Reihenfolge in Deinem Nick einfach nicht merken, schon komisch :/
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Das hat eggy bestimmt absichtlich gemacht, um dich ein bisschen zu aergern. Das liegt bestimmt daran, dass eggy sein Gehirn mit Nachdenken ueberanstrengt hat.JTH hat geschrieben:05.08.2021 18:26:05Nur für den Buchstabendreher da oben muss ich einmal böse gucken.
Ich finde, dass dieser Thread auch erst ab dem Zeitpunkt so richtig spannend geworden ist, nachdem das Ursprungsproblem geloest war ... und lustig ist er dann so richtig geworden, seit wir angefangen haben technisch rumzuspinnen. Ich bin also weiterhin gespannt, was eggys Nachdenkversuche noch so alles zu Tage befoerdern werden ... wobei mir sein Kopfweh schon leid tut. Also bitte nicht ueberanstrengen!
... wobei es vielleicht auch mal wieder an JTH laege, die naechste tolle Idee einzubringen ... darf ja jeder mal ein bisschen Kopfweh haben, dann ist's fuer keinen zu viel auf einmal.
Use ed once in a while!
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Ich versuche mich gerade an einer Variante mit zwei Named Pipes, um resourcensparend, ähem, das ls bzw. seq nur einmal auszuführen. Mit parallel fiel mir noch nichts direkt ein.Meillo hat geschrieben:05.08.2021 18:39:05... wobei es vielleicht auch mal wieder an JTH laege, die naechste tolle Idee einzubringen ...
Danke für die Korrektur, egyg
Manchmal bekannt als Just (another) Terminal Hacker.
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
ich hab grade in den fingern ... ich krieg aber "a" nicht durch seq ersetzt ... das Zeug ist schon komisch
Code: Alles auswählen
parallel -i sh -c "echo C{}; echo D{} {}" -- "a b"
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Eselsbruecke: Just (another) Terminal Hacker.eggy hat geschrieben:05.08.2021 18:37:43ich kann mir die Reihenfolge in Deinem Nick einfach nicht merken, schon komisch :/
Use ed once in a while!
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Ha, das ist gut
Manchmal bekannt als Just (another) Terminal Hacker.
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Neue Signatur?
Use ed once in a while!
Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen
Besten Dank für die ganzen Denkanstöße. War richtig interessant das nachzuvollziehen.