[GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von eggy » 04.08.2021 20:10:05

Nachdenken?! ... wie kommst Du denn bloß auf so abwegige Ideen .. Leute gibts

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von Meillo » 04.08.2021 22:36:44

Ich hab mir nochmal was ausgedacht (da ich ja keine derartige Abneigung gegen das Denken habe :-P ):

Code: Alles auswählen

sed 'n;n;s/$/\n/'|fmt|awk '/./{print++i":",$0}'
(Extra in whitespacearmer Schnuckelform. ;-) )
Use ed once in a while!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von eggy » 05.08.2021 11:08:02

nice - da hat sich das Denken aber mal gelohnt :mrgreen:

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von Meillo » 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. ;-)
Use ed once in a while!

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von JTH » 05.08.2021 11:45:01

Meillo hat geschrieben: ↑ zum Beitrag ↑
04.08.2021 22:36:44
Ich hab mir nochmal was ausgedacht (da ich ja keine derartige Abneigung gegen das Denken habe :-P ):
Hehe, definitiv die kreativste Lösung bisher.

Bei meinen ganzen Dateinamen mit über 80 Zeichen bricht das 3-Namen-in-einer-Zeile aber leider wieder am fmt in der Mitte :twisted:

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: ↑ zum Beitrag ↑
03.08.2021 22:17:32
Die klammerlose Schreibweise von printf() und die spacelosen String-Verkettungen sind nicht unbedingt ein toller Stil ...
Meillo hat geschrieben: ↑ zum Beitrag ↑
04.08.2021 22:36:44
(Extra in whitespacearmer Schnuckelform. ;-) )
Jaja, normalerweise bin ich großzügiger mit der Formatierung :P Das passte nur nicht mehr so gut in eine Zeile im Forum.

Meillo hat geschrieben: ↑ zum Beitrag ↑
03.08.2021 22:17:32
vielleicht solltest du es dann besser mit Perl versuchen.
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: ↑ zum Beitrag ↑
03.08.2021 22:17:32
Ich wuerde daher sagen, dass die Aufteilung in zwei Programme eher positiv gewertet werden sollte. ;-)
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 Augen ;)
Manchmal bekannt als Just (another) Terminal Hacker.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von eggy » 05.08.2021 12:00:17

Meillo hat geschrieben: ↑ zum Beitrag ↑
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. ;-)
Nee blos nicht, beim letzten Mal gab's drei Tage furchtbares Koppweh :roll:

@JTH: fmt -w irgendwas ... ka, was da das Maximum ist (MAXINT vermutlich :mrgreen: )

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von JTH » 05.08.2021 12:08:36

eggy hat geschrieben: ↑ zum Beitrag ↑
05.08.2021 12:00:17
@JTH: fmt -w irgendwas ... ka, was da das Maximum ist (MAXINT vermutlich :mrgreen: )
Sollte man erwarten:

Code: Alles auswählen

~$ fmt -w 2501
fmt: invalid width: ‘2501’: Numerical result out of range
~$ echo Löppt! | fmt -w 2500
Löppt!
Nanu, wo kommt denn die Grenze her. Ich werd mal grad was nachschlagen.

Edit: „arbitrary limits“, immer nett :)
Manchmal bekannt als Just (another) Terminal Hacker.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von eggy » 05.08.2021 12:17:41

Um nochmal etwas ontopic zu bleiben, mir lässt die nl Sache keine Ruhe.

Code: Alles auswählen

seq 1 3000 | awk '{printf" "$0} NR%3==0{print""}' | nl -s ":" -w1
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 :twisted: )

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von Meillo » 05.08.2021 14:07:33

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

eggy hat geschrieben: ↑ zum Beitrag ↑
05.08.2021 12:17:41
Um nochmal etwas ontopic zu bleiben, mir lässt die nl Sache keine Ruhe.

Code: Alles auswählen

seq 1 3000 | awk '{printf" "$0} NR%3==0{print""}' | nl -s ":" -w1
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?
nl ist ja so 'n neumodisches Ding, das eigentlich niemand braucht, weil man seit 1977 ja `awk '{print NR, $0}'' verwenden kann. ;-)

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!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von eggy » 05.08.2021 14:18:59

Die Debianversion ist aus den coreutils
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) */

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von eggy » 05.08.2021 17:14:23

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' ) 
Jetzt bleibt nur noch das Problem, wie erspart man sich an der Stelle das doppelte seq bzw. ls, ohne dessen Ausgabe auch temporär zwischen zu speichern.
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?

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von Meillo » 05.08.2021 17:24:48

Es waere vielleicht einfacher, du wuerdest sowas verwenden:

Code: Alles auswählen

nl|sed 's/^ *//;s/\t/: /'
oder auch:

Code: Alles auswählen

nl|awk '{$1=$1":"}1'
;-)

... andererseits schaue ich dir auch gerne bei deinen Denkbemuehungen zu. :mrgreen:
Use ed once in a while!

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von JTH » 05.08.2021 17:44:12

Ich finde ja gerne Probleme – mit 9 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
Müsste das nicht auch eher

Code: Alles auswählen

-w $(w=$(($(seq 1 1000 | wc -l) / 3)); echo ${#w})
sein? Das ursprüngliche klappt nicht bei z.B. 99 Einträgen.

eggy hat geschrieben: ↑ zum Beitrag ↑
05.08.2021 17:14:23
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?
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.

Meillo hat geschrieben: ↑ zum Beitrag ↑
05.08.2021 14:07:33
Irgendwie soll das Script ja auch einen Sinn haben ... der sich mir bei 2000 Zeichen langen Zeilen irgendwie nicht mehr so ganz erschliesst.
Ich habe das Gefühl, von der ursprünglichen Frage hat sich das mit der investierten Zeit schon etwas entfernt ;)
Manchmal bekannt als Just (another) Terminal Hacker.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von eggy » 05.08.2021 17:51:50

@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 :mrgreen:

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' )
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 :oops:
Zuletzt geändert von eggy am 05.08.2021 18:31:14, insgesamt 2-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von Meillo » 05.08.2021 17:58:29

eggy hat geschrieben: ↑ zum Beitrag ↑
05.08.2021 17:51:50
... wc | wc ... awk | awk ... irgendwie drehen wir uns im Kreis :mrgreen:
Nee, das ist ein Zeichen fuer die vielfaeltige Nuetzlichkeit des jeweiligen Kommandos. ;-)
Bleibt aber immer noch: wie bekomm ich die seq Ausgabe zweimal in die Verarbeitung ohne das Zeug in ner Variable zu speichern
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.

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!

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von JTH » 05.08.2021 18:26:05

eggy hat geschrieben: ↑ zum Beitrag ↑
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.
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.
Manchmal bekannt als Just (another) Terminal Hacker.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von eggy » 05.08.2021 18:37:43

@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 :/

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von Meillo » 05.08.2021 18:39:05

JTH hat geschrieben: ↑ zum Beitrag ↑
05.08.2021 18:26:05
Nur für den Buchstabendreher da oben muss ich einmal böse gucken.
Das hat eggy bestimmt absichtlich gemacht, um dich ein bisschen zu aergern. :twisted: Das liegt bestimmt daran, dass eggy sein Gehirn mit Nachdenken ueberanstrengt hat. :lol:

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. :-D
Use ed once in a while!

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von JTH » 05.08.2021 18:45:34

Meillo hat geschrieben: ↑ zum Beitrag ↑
05.08.2021 18:39:05
... wobei es vielleicht auch mal wieder an JTH laege, die naechste tolle Idee einzubringen ...
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.

Danke für die Korrektur, egyg :wink:
Manchmal bekannt als Just (another) Terminal Hacker.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von eggy » 05.08.2021 18:48:44

ich hab grade

Code: Alles auswählen

parallel -i  sh -c "echo C{}; echo D{} {}" --  "a b"
in den fingern ... ich krieg aber "a" nicht durch seq ersetzt ... das Zeug ist schon komisch

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von Meillo » 05.08.2021 20:55:23

eggy hat geschrieben: ↑ zum Beitrag ↑
05.08.2021 18:37:43
ich kann mir die Reihenfolge in Deinem Nick einfach nicht merken, schon komisch :/
Eselsbruecke: Just (another) Terminal Hacker. :THX:
Use ed once in a while!

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von JTH » 05.08.2021 21:47:05

Ha, das ist gut :lol:
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von Meillo » 05.08.2021 22:13:07

Neue Signatur? ;-)
Use ed once in a while!

BrotherJ
Beiträge: 323
Registriert: 15.11.2018 07:56:18

Re: [GELÖST] Drei Array-Inhalte pro Schleifendurchlauf anzeigen

Beitrag von BrotherJ » 08.08.2021 19:17:53

Besten Dank für die ganzen Denkanstöße. War richtig interessant das nachzuvollziehen.

Antworten