Aus pipeline in eine Datei schreiben mit und ohne Zeilenvorschub

L

L0rd

Mitglied
Hallo,

also ich filtere mehrmals hintereinander aus einer Datei verschiedene Sachen heraus und schreibe sie dann in eine Datei namens tabelle mit ";" getrennt, damit ich das ganze dann in Excel auswerten kann.

also so:

Code:
.....| sed -n '$p' | sed 's/\t//g' >> tebelle;
.....| sed -n '$p' | sed 's/\t//g' >> tebelle;
.....| sed -n '$p' | sed 's/\t//g' >> tebelle;

wie mache ich das so dass die ersten Ergebnisse in gleiche Zeile hintereinander geschrieben werden und nur beim letzten mal einen Zeilenvorschub (\n) habe ?
habe versucht "echo -ne" bzw "echo -e" einzubauen, leider ging es so nicht.

Und eine zweite kleine Frage: wie baue ich nach jedem Wert ein Semikolon(ist mein Trennzeichen) ein ?

Vielen Dank !
 
Hallo,
wenn DU Deine Tabelle ohnehin in Teilschritten (also mehreren Kommandos) aufbaust, kannst Du doch nach den ersten Ergebnisse den Zeilenvorschub Deinen Wünschen entsprechend anpassen.
Wenn Deine Tabelle bereits vorliegt und das Trennzeichen soll rein, kannst Du das doch sicher auch mit sed oder tr erledigen. Tausche Leerzeichen gegen Semikolon.
Anders ist es sicher sehr schwierig, da Du Deine Tabelle ja nicht pro Wert, sondern pro Zeile erstellst.
Übrigens kann man (je nach Betriebssystem und sed-Version) auch die sed-Befehle verbinden mit -e (statt immer wieder Pipe).

Gruß zst
 
Hier nochmal mein Code, um sed gehts hier nicht, ich zeige hier vereinfachtes Beispiel, es geht um Pipelines und wie man keine newline damit hinkriegt.
Code:
.....| sed ... | sed ... >> tebelle; # hier kein Zeilenvorschub
.....| sed ... | sed ... >> tebelle; # hier kein Zeilenvorschub
.....| sed ... | sed ... >> tebelle; # hier sollte Zeilenvorschub kommen

momentan ist es so

Code:
wert11
wert12
wert13
wert21
wert22
wert23
....

soll aber so sein

Code:
wert11;wert12;wert13;
wert21;wert22;wert23;
wert31;wert32;wert33;

In einem Wert kommen Leerstellen vor (ab und zu), aber nicht davor und nicht dahinter, deswegen muss einfach stur ein Semikolon am Ende des Werts angehängt werden - da gibt es keinen Zeichen den man durch Semikolon ersetzen kann.

wenn DU Deine Tabelle ohnehin in Teilschritten (also mehreren Kommandos) aufbaust, kannst Du doch nach den ersten Ergebnisse den Zeilenvorschub Deinen Wünschen entsprechend anpassen.
Ja und wie ? das war ja gerade meine Frage. Aus jeweils einer Pipeline kommt ein Wert angeflogen was mache ich ? :) wie schreibe ich es in Datei so hin wie ich es oben beschrieben habe ?

Vielleicht habt ihr andere Vorschläge wie man aus einer Datei mehrere Sachen rausfiltern kann und die dann so hinspeichern wie ich es möchte. Ich habe es in mehereren Schritten gemacht weil es für mich so einfacher ist Überblick zu behalten.
Mein Script ist klein und auf Perfomance kommt es mir nicht an.
 
Zuletzt bearbeitet:
um sed gehts hier nicht, ich zeige hier vereinfachtes Beispiel, es geht um Pipelines und wie man keine newline damit hinkriegt.
Das ist mir bewusst, daher schrieb ich:
"Wenn Deine Tabelle bereits vorliegt und das Trennzeichen soll rein, kannst Du das doch sicher auch mit sed oder tr erledigen."
Wenn die Leerzeichen ungeeignet sind, kannst Du andere Zeichen austauschen.
Du meinst:
da gibt es keinen Zeichen den man durch Semikolon ersetzen kann.
Doch, die Zeichen, die Du sicher nicht siehst oder beachtest: das LF-Zeichen.
Das muss also VOR dieser Zeile geschehen: ".....| sed ... | sed ... >> tebelle; # hier sollte Zeilenvorschub kommen"
Aus jeweils einer Pipeline kommt ein Wert angeflogen was mache ich ?
Wenn ich Deinem Beispiel oben folge, dann würde ich dafür tr verwenden.
Wenn bis dahin alle Werte in eine Zeile sollen, kannst Du ja die Datei "tebelle" bearbeiten und kannst auf Einzelaktionen nach jeder Pipe verzichten.
Es gibt aber sicher auch eine andere, bessere, schnellere Lösung ... wie immer halt.
 
ich habe über tr nachgedacht und hier eine "skizze":

Code:
.....| sed ... | sed ... | tr  LF ";" >> tebelle; # hier kein Zeilenvorschub
.....| sed ... | sed ... | tr  LF ";"  >> tebelle; # hier kein Zeilenvorschub
.....| sed ... | sed ... | tr  LF ";LF"  >> tebelle; # hier sollte Zeilenvorschub kommen

Jetzt weiss nur noch nicht wie ich LF ins tr bringe, weil so "LF" sucht er nach Buchstabenfolge LF

und ob das hier gehen wird ";LF" ...

eine Idee ?
 
Zuletzt bearbeitet:
So geht es bei mir (für die gesamte Datei):
Code:
cat DATEI | tr "\n" ";"
Danach hängst Du noch ein "\n" für die neue Zeile an.
Gruß zst
 
danke !
Danach hängst Du noch ein "\n" für die neue Zeile an.
wie mache ich das genau ? so tr "\n" ";\n" ?

Die Frage ist auch, wird Semikolon angehängt wenn aus Pipeline nichts rauskommt ? (also wenn nichts gefunden wird) Wir ersetzen ja und wenn wirklich keine Zeichen in Pipeline sind, kommen da trotzdem "\n" raus ? (die wir dann durch ; ersetzen)
Das ist ja dann eine leere Zelle in der Tabelle und es sollte sein.
 
Danach hängst Du noch ein "\n" für die neue Zeile an. Mit printf oder echo geht das.
 

Ähnliche Themen

Zeielenblock von einer Datei in eine neue schreiben

Script zu bearbeiten einer conf Datei

Bash Skript: [[: not found Fehler

Last mit etc/passwd anzeigen lassen

bash: Fehlermeldung und Werte in Array sortieren?

Zurück
Oben