Zeilen auffüllen.

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
lemak
Beiträge: 1213
Registriert: 09.11.2007 13:25:57
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Zeilen auffüllen.

Beitrag von lemak » 18.08.2012 15:02:13

Hallo,

gibt es ein Tool das Zeilen in einer Ausgabe auffüllt?

Angenommen ich habe

Code: Alles auswählen

cat | sort
was als Beispiel 3 Zeilen zurück gibt. Ich brauche aber immer min. 10 Zeilen. Auch wenn die dann leer sind. Z.B. in meinem Fall soll ein tail -2 dann 2 leere Zeilen zurückgeben und nicht die letzten 2 der 3 Zeilen vom Output.

MfG
up

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

Re: Zeilen auffüllen.

Beitrag von Meillo » 18.08.2012 17:05:41

Code: Alles auswählen

$ for i in `seq 10` ; do echo >>10lines ; done

$ ... | sort | paste -d '' 10lines -

Use ed once in a while!

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

Re: Zeilen auffüllen.

Beitrag von Meillo » 18.08.2012 17:28:49

Alternativ:

Code: Alles auswählen

... | awk '1; END { while (NR++<10) { print "" } }'
Use ed once in a while!

lemak
Beiträge: 1213
Registriert: 09.11.2007 13:25:57
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Zeilen auffüllen.

Beitrag von lemak » 18.08.2012 18:27:29

Danke für die Lösungen; Wobei ich die erste nicht verstehe :neutral:
Die coreutils haben da dann wohl echt nix für.

up

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

Re: Zeilen auffüllen.

Beitrag von Meillo » 19.08.2012 10:25:30

up hat geschrieben:Danke für die Lösungen; Wobei ich die erste nicht verstehe :neutral:
Die coreutils haben da dann wohl echt nix für.
Doch, die erste Loesung eben. paste(1) sollte definitiv Teil der coreutils (oder textutils, oder wie auch immer der Teil dann heisst) sein.

Code: Alles auswählen

$ for i in `seq 10` ; do echo >>10lines ; done
Legt eine Datei namens `10lines' an die zehn leere Zeilen enthaelt:

Code: Alles auswählen

$ od -c 10lines 
0000000  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n
0000012

Code: Alles auswählen

$ ... | sort | paste -d '' 10lines -
paste(1) ``klebt'' zwei Dateien nebeneinander. Das ist so aehnlich wie cat(1) nur horizontal, statt vertikal. Die erste Zeile von Datei zwei wird an die erste Zeile von Datei eins angehaengt, usw. mit allen weiteren Zeilen. Normalerweise wird dazwischen ein Tab gesetzt, das habe ich mit -d '' verhindert. Datei eins ist `10lines'; Datei zwei ist das was aus der Pipe kommt. Die Reihenfolge koennte man aendern, da in Datei 10lines alle Zeilen leer sind und kein Trennsymbol eingefuegt wird. Der Aufwand wird nur betrieben um mindestens zehn Zeilen Ausgabe zu erzeugen. Die Ausgabe von paste umfasst soviele Zeilen wie die laengere der beiden Dateien. Das sind mindestens zehn, da 10lines zehn (leere) Zeilen hat.

Jetzt alles klar?


Zum Thema Manpage von paste(1) kann ich nur darauf verweisen:
http://xkcd.com/912/ :-(
Use ed once in a while!

lemak
Beiträge: 1213
Registriert: 09.11.2007 13:25:57
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Zeilen auffüllen.

Beitrag von lemak » 19.08.2012 14:03:15

Was soll ich sagen. Neuer Tag neues Glück. Nun geht es auch :-) Und seit /tmp auch im RAM liegt, kann man ja mit so Zwischen-Dateien Arbeiten...

Danke
up

lemak
Beiträge: 1213
Registriert: 09.11.2007 13:25:57
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Zeilen auffüllen.

Beitrag von lemak » 19.08.2012 14:06:57

Zum Thema Manpage von paste(1) kann ich nur darauf verweisen:
http://xkcd.com/912/ :-(
Ja die hat das erhellende Beispiel...

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

Re: Zeilen auffüllen.

Beitrag von Meillo » 23.08.2012 15:32:37

Meillo hat geschrieben:

Code: Alles auswählen

$ for i in `seq 10` ; do echo >>10lines ; done
Ein Freund (der es bevorzugt ungenannt zu bleiben) hat hierzu eine coole Alternative vorgeschlagen:

Code: Alles auswählen

yes '' | head -10
Ich finde das zu gut um es fuer mich zu behalten.
Use ed once in a while!

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Zeilen auffüllen.

Beitrag von Cae » 23.08.2012 15:43:52

Meillo hat geschrieben:Ein Freund (der es bevorzugt ungenannt zu bleiben) hat hierzu eine coole Alternative vorgeschlagen:

Code: Alles auswählen

yes '' | head -10
Die ist wirklich so simpel wie genial.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

lemak
Beiträge: 1213
Registriert: 09.11.2007 13:25:57
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Zeilen auffüllen.

Beitrag von lemak » 23.08.2012 16:10:30

Meillo hat geschrieben: Ein Freund (der es bevorzugt ungenannt zu bleiben) hat hierzu eine coole Alternative vorgeschlagen:
Wie Lösungen so ins Forum finden.

Code: Alles auswählen

yes '' | head -10
Ich finde das zu gut um es fuer mich zu behalten.
Spart gut was beim Tippen und rödelt nicht so oft auf der Datei rum.

Gewonnen hat aber der, wer das fehlende tool in die coreutils bringt. ;-) IMO ist das ein Lücke.

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Zeilen auffüllen.

Beitrag von ThorstenS » 23.08.2012 16:19:48

Meillo hat geschrieben:

Code: Alles auswählen

yes '' | head -10
Ich finde das zu gut um es fuer mich zu behalten.
sehr nice! Aber auch optimierungsfähig:

Code: Alles auswählen

yes ''|head
Da der OP sowieso 10 Zeilen haben wollte und das der Standard bei head ist…

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

Re: Zeilen auffüllen.

Beitrag von Meillo » 23.08.2012 16:23:18

up hat geschrieben: Gewonnen hat aber der, wer das fehlende tool in die coreutils bringt. ;-) IMO ist das ein Lücke.
Wo ist da eine Luecke? sort, paste, yes, head ... die sind doch alle Teil der Coreutils. Und mit awk ist's nur eine Zeile. Wozu also ein spezielles (= beschraenktes) Tool schreiben wo sich das Problem mit vorhandenen Tools ohne viel Aufwand loesen laesst?

Btw: Das ist der gleich Grund weshalb head(1) unnoetig ist. `sed 10q' ist verfuegbar und ebenso einfach.
Use ed once in a while!

lemak
Beiträge: 1213
Registriert: 09.11.2007 13:25:57
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Zeilen auffüllen.

Beitrag von lemak » 23.08.2012 16:27:22

Wo ist da eine Luecke?
Ich kann als Begründung nur sagen, das ich mich an der Datei die gebraucht wird, um die 10 Zeilen zwischen zu speichern, störe (auch eine Shell-Variable möchte hierfür nicht wirklich). Mehr Kritik habe ich an der Lösung nicht. Funktionieren tut es wunderbar.

Benutzeravatar
whisper
Beiträge: 3379
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Zeilen auffüllen.

Beitrag von whisper » 23.08.2012 17:09:50

Randnotiz:
yes ist ein tool, das bei mir in Vergessenheit geraten ist. Bin mir sicher, das wusste ich mal :roll:
Ich sollte öfters wieder alte scripte anschauen bzw. in den grundlegenden Paketen stöbern.
Irgendwie glaubte ich, yes wäre ein bash builtin und würde true ersetzen...
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Zeilen auffüllen.

Beitrag von ThorstenS » 24.08.2012 11:45:38

whisper hat geschrieben:Irgendwie glaubte ich, yes wäre ein bash builtin und würde true ersetzen...
zu Zeiten meiner SuSE 6.4 war das IMHO auch noch so. Ich habe es auch erst vor wenigen Jahren wiederentdeckt.
Sinnvoll einsetzen tue ich es aber nicht. Heutzutage haben alle wichtigen tools schon eine Option für "ja, ich will"

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

Re: Zeilen auffüllen.

Beitrag von Meillo » 24.08.2012 12:36:39

whisper hat geschrieben: Irgendwie glaubte ich, yes wäre ein bash builtin und würde true ersetzen...
: (Doppelpunkt, das Null-Kommando) ist das Shell-Builtin das true(1) ersetzt.
Use ed once in a while!

Antworten