Datei "drehen"

Diskutiere Datei "drehen" im Shell-Skripte Forum im Bereich Programmieren unter Linux/Unix; Hallo Leute, heute will ich eine Datei "drehen", so dass die Spalten nachher in Zeilen stehen und die Zeilen in Spalten. Eine kleines Beispiel:...

  1. #1 flappinski, 20.11.2006
    flappinski

    flappinski Foren As

    Dabei seit:
    31.03.2006
    Beiträge:
    87
    Zustimmungen:
    0
    Hallo Leute,
    heute will ich eine Datei "drehen", so dass die Spalten nachher in Zeilen stehen und die Zeilen in Spalten.
    Eine kleines Beispiel:
    vorher:
    Name,id1, id2,id3
    strasse,land,berg,brücken
    geld,viel,wenig,mittel

    nachher:
    Name,strasse,geld
    id1,land,viel
    id2,berg,wenig
    id3,brücken,mittel

    Hat jemand eine Idde? Gibt es dafür vielleicht sogar ein Tool?
    Danke und viele Grüsse,
    Stephan
     
  2. #2 schorsch312, 20.11.2006
    schorsch312

    schorsch312 Routinier

    Dabei seit:
    18.07.2006
    Beiträge:
    372
    Zustimmungen:
    0
    Schreib die einzelnen Einträge per SciLab oder Ocatave,.. in eine Matrix und transponiere diese.
    Gruß, Georg
     
  3. #3 flappinski, 20.11.2006
    flappinski

    flappinski Foren As

    Dabei seit:
    31.03.2006
    Beiträge:
    87
    Zustimmungen:
    0
    Hi Georg,
    ich kenne SciLab oder Ocatave nicht, aber menst Du es kann mit 1000 Zeilen auf 300000 Spalten umgehen? Die Datei ansich ist schon eni gutes Gigabyte gross, bis jetzt haben schon viele Standalones aufgegeben.
    Ich würde das gerne mit der Shell lösen, so ungefähr:
    mit awk die Salte auftrennen und mit paste dann an die bisherige Datei anhängen...
    falsch gedacht?
     
  4. #4 schorsch312, 20.11.2006
    schorsch312

    schorsch312 Routinier

    Dabei seit:
    18.07.2006
    Beiträge:
    372
    Zustimmungen:
    0
    Geht auch.
    Ist deine Tabelle denn voll belegt? Will heißen ist jeder Eintrag vorhanden oder hast du in den Zeilen mal mehr mal weniger Einträge?
    Gruß, Georg
     
  5. #5 flappinski, 20.11.2006
    flappinski

    flappinski Foren As

    Dabei seit:
    31.03.2006
    Beiträge:
    87
    Zustimmungen:
    0
    die tabelle ist voll belegt, ja.
     
  6. #6 Peregrine, 20.11.2006
    Peregrine

    Peregrine Honorarkonsul

    Dabei seit:
    03.08.2006
    Beiträge:
    338
    Zustimmungen:
    0
    Ort:
    München, Bayern, Germany
    In welchem Dateiformat liegen die Daten denn vor? Ist das ein reines ASCII Textfile oder sind die Daten in einer DB gespeichert? An und für sich hört sich die Problemstellung nach "Transponieren von Tabellen" an - Excel beherrscht das beispielsweise 1A. Nur ob du bei Filegrößen von 1GB mit Excel glücklich wirst wage ich zu bezweifeln :D
     
  7. #7 flappinski, 20.11.2006
    flappinski

    flappinski Foren As

    Dabei seit:
    31.03.2006
    Beiträge:
    87
    Zustimmungen:
    0
    @ Peregrine:
    Dat ist genau mein Punkt. Mit Excel geht da schon lange, lange nix mehr.
    Hier eine Lösung für mein kleines File:
    for ((cells=1; cells<=5; cells++)) ; do cut -f $cells -d, test_table.txt | paste - - - - ; done;

    zwei Probleme dabei:
    1) Die "4" für die 4 Spalten muss ich vorher rausfinden. Gut das werde ich schon hinbekommen.
    2) Die Anzahl der "-" bei paste muss durch die Anzahl der Zeilen im Datenfile definiert werden. Schon schwieriger...

    Ausserdem halte ich es für total doof, die einzelnen Spalten immer wieder da rauszuholen. Folgender Ansatz gefällt mit schon besser:
    cat test_table.txt | sed 's/$/\n/g' | sed 's/,/\n/g'

    Dabei kommt folgendes raus:
    Name
    id1
    id2
    id3

    strasse
    land
    berg
    brücken

    geld
    viel
    wenig
    mittel



    Jetzt müsste ich das nur noch wieder in die Spalten pressen können.....
     
  8. #8 flappinski, 20.11.2006
    flappinski

    flappinski Foren As

    Dabei seit:
    31.03.2006
    Beiträge:
    87
    Zustimmungen:
    0
    ein erster Schritt wäre für mich:
    Wie bekomme ich jede Zeile einer Datei in eine eigene Datei?
     
  9. #9 flappinski, 20.11.2006
    Zuletzt bearbeitet: 20.11.2006
    flappinski

    flappinski Foren As

    Dabei seit:
    31.03.2006
    Beiträge:
    87
    Zustimmungen:
    0
    falls es jemand interessiert, ich habe eine Möglichkeit gefunden:

    erst die Datei in einzelne Zeilen auftrennen:
    split -1 -a5 gt_sim.txt # die -a Option lässt einen mehr als hundert Zeilen besarbeiten

    dann eine Startdatei erzeugen:
    cat xaaaaa | sed 's/,/\n/g' > first # ersetzt alle Kommas durch Linefeed -> dadruch sind die Spaltenüberschriften jetzt Zeilen überschriften

    die erste Datei löschen:
    rm xaaaaa

    und mit allen anderen fortfahren:
    for file in x* ; do cat $file | sed 's/,/\n/g' > second ; paste first second > temp ; mv temp first ; done
    # hängt eine erzeugte Datei als Zeilen-End-zu-End an, speichert in einer temp-Datei und danach wieder als first umbenannt.

    funktioniert, aber braucht relativ lange für 1 GB (bestimmt mehrere Minuten). Wer das optimieren kann, ist herzlich eingeladen, mitzuknoblen....
     
  10. #10 Peregrine, 20.11.2006
    Peregrine

    Peregrine Honorarkonsul

    Dabei seit:
    03.08.2006
    Beiträge:
    338
    Zustimmungen:
    0
    Ort:
    München, Bayern, Germany
    1) Bitte angewöhnen eigene Posts editieren und nicht zu jedem Satz ein neuer Post
    2) Warum bewältigst du Files mit >1GB Größe als Textfile? Performance konvergiert gegen NULL :-)
     
  11. #11 schorsch312, 20.11.2006
    schorsch312

    schorsch312 Routinier

    Dabei seit:
    18.07.2006
    Beiträge:
    372
    Zustimmungen:
    0
    Rein Interesse halber:
    Was würdest du denn für ein Dateiformat nehmen?
    Gruß, Georg
     
  12. #12 flappinski, 20.11.2006
    flappinski

    flappinski Foren As

    Dabei seit:
    31.03.2006
    Beiträge:
    87
    Zustimmungen:
    0
    das würde mich auch interessieren.


    Sorry, dass ich die Postanzahl erhöhe, aber ich denke, wenn der Post erst mal ne Weile steht, dann schaut sich keiner mehr den editierten an...
     
  13. Sharoz

    Sharoz Mitglied

    Dabei seit:
    10.11.2005
    Beiträge:
    46
    Zustimmungen:
    0
    Wenn man mit der Shell arbeitet wird man an Textdateien nicht vorbeikommen.
    Zuminidest mit Hochsprachen könnte man die ganze Chose im Binärformat ablegen, was tatsächlich performanter ist (kA wieso genau, wikipedia weiß da bestimmt was zu...).

    Überhaupt liegt aber die Flaschenhals hier in der Tatsache, das es ein Shellskript ist. Die werden nämlich interpretiert und sind somit verdammt langsam. Vor allem da ja auch noch andere externe Programme aufgerufen werden, und das in jedem Schleifendurchlauf.

    An deiner Stelle würde ich da etwas kompilierbares bemühen.
    Die Datei (gerne als Text) einlesen, in ein zweidimesionales Array schaufeln, und eine der X Transponierfktn. nutzen, die einigermaßen schnell sind.
    Zum schluss packst du dann den Spaß wieder zurück in eine (neue?) Datei.

    Ich denke das sollte schneller gehen, vor allem, wenn du sachen wie [C]fscanf benutzt, wo du direkt formatiert einlesen kannst.

    MfG
    Sharoz
     
  14. #14 flappinski, 20.11.2006
    flappinski

    flappinski Foren As

    Dabei seit:
    31.03.2006
    Beiträge:
    87
    Zustimmungen:
    0
    also,
    ich habe das jetzt doch mit der shell gelöst, und zwar ziemlich schnell:
    ähnliches prinzip, wie oben:
    1) alle einzelnen zeilen in einzelne Dateien
    2) mit sed -i in all diesen Dateien das TAB in ein newline geändert
    3) mit paste x* > Out_File ziemlich schnell einen Zusammenschluss herbeigeführt.

    @Sharoz: Du hast schon Recht, aber das zweidimensionale Array ist schon mal 300000 mal 1000 Zellen gross, und dass noch aufgefüllt mit Strings, da hakt und quietscht es an allen Enden und Ecken....
    Ausserdem muss ich dann porgrammieren und die shell macht doch so viel Spass. Und es hat geklappt!
     
  15. Sharoz

    Sharoz Mitglied

    Dabei seit:
    10.11.2005
    Beiträge:
    46
    Zustimmungen:
    0
    Für heutige Speichergrößen sollte das nicht so das Problem sein, aber du hast recht, man könnte sich auch mit Pointern in die Datei begnügen und damit arbeiten. Bzw, es auch schrittweise machen. Da kann man an allen Ecken und Enden noch optimieren ;-)

    Mit Shell fühle ich micht immer unwohl. Da fehlt mir einfach was. Außerdem finde ich die Syntax gewöhnungsbedürftig. Aber jedem das seine ;-)

    Sharoz
     
Thema: Datei "drehen"
Besucher kamen mit folgenden Suchen
  1. shell zeilen in spalte umwandeln

    ,
  2. awk spaltenüberschrift

Die Seite wird geladen...

Datei "drehen" - Ähnliche Themen

  1. Anlage einer SWAP-Datei unter CentOS 7 funktioniert nicht

    Anlage einer SWAP-Datei unter CentOS 7 funktioniert nicht: Hallo zusammen, ich verwende einen vServer von Strato (Linux V30) mit CentOS 7 64bit. Hier wollte ich nun einen SWAP-Speicher mit 8GB anlegen -...
  2. Dateiinhalt verdoppeln

    Dateiinhalt verdoppeln: Hallo, ich möchte den Inhalt einer Datei verdoppeln, Kopf- und Endesatz ausgenommen. Danach muss im Endesatz die Datensatzanzahl angepasst werden...
  3. Dateien in Unix finden, die mehrere Strings beinhalten

    Dateien in Unix finden, die mehrere Strings beinhalten: Hallo liebe Leute, ich versuche über die Shell unter Unix alle Dateien ausfindig zu machen, die sowohl den SuchstringA als auch den SuchstringB...
  4. Textdatei filtern und löschen mit grep /sed

    Textdatei filtern und löschen mit grep /sed: Guten morgen liebe Forenmitglieder, da ich etliche Jahre in Sachen Linux pausiert habe und nun wegen beruflichem Wechsel wieder dort einsteige...
  5. Fragen zu stty, quotes und Datein (flush)

    Fragen zu stty, quotes und Datein (flush): Hi, ich schreibe seit ein paar Tagen ein Skript, dass über die Serielle Schnittstelle kommuniziert. Leider gibt es noch zwei Probleme, die ich...