Datei "drehen"

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von flappinski, 20.11.2006.

  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. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #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
     
  4. #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?
     
  5. #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
     
  6. #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.
     
  7. #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
     
  8. #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.....
     
  9. #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?
     
  10. #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....
     
  11. #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 :-)
     
  12. #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
     
  13. #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...
     
  14. 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
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #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!
     
  17. 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"

Die Seite wird geladen...

Datei "drehen" - Ähnliche Themen

  1. Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...

    Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...: Ich habe eine Textdatei in der ich Einträge bis zum 3. Leerzeichen mit den restlichen Zeilen (auch nur bis 3. Leerzeichen) vergleichen muss und...
  2. Alle Dateien eines Verzeichnisses mit einer anderen Datei vergleichen

    Alle Dateien eines Verzeichnisses mit einer anderen Datei vergleichen: Hallo, ich habe ein Verzeichnis, darin enthalten sind mehrere Dateien. Nun möchte ich alle Dateien (Parameter $1) gegen eine konstante Datei...
  3. Dateiinhalte vergleichen - Neue Sätze dann ausgeben

    Dateiinhalte vergleichen - Neue Sätze dann ausgeben: Liebe Forumsmitglieder, ich benöte mal wieder Eure Hilfe: Ich möchte 2 Dateien vergleichen. Datei-1 hat z.B. 100 Datensätze mit mehreren Feldern...
  4. Dateien selektieren und zählen

    Dateien selektieren und zählen: Hallo, das ist mein erster Beitrag, bitte entschuldigt, falls nicht alles richtig geschrieben ist. Ich muss meine erste Hausaufgabe als...
  5. Timestamp an Inhalt einer Textdatei anfügen

    Timestamp an Inhalt einer Textdatei anfügen: Hallo, ich als neuer, unerfahrener Nutzer von Linux und der bash hätte folgende Frage. Und zwar würde ich gerne mit einem command den Zeitstempel...