Wie automatisiere ich: Textdatei nur jede 10. Zeile behalten

Dieses Thema im Forum "MacOS X / Darwin" wurde erstellt von CAR, 10.04.2009.

  1. #1 CAR, 10.04.2009
    Zuletzt bearbeitet: 10.04.2009
    CAR

    CAR Jungspund

    Dabei seit:
    10.04.2009
    Beiträge:
    10
    Zustimmungen:
    0
    Hallo,

    ich suche nach einer Automatisierung folgender Aufgabe:

    1. Textdatei öffnen
    2. jede 10. Zeile behalten, alle anderen löschen
    3. Textdatei speichern und schließen

    Das ganze soll für mehrere Textdateien in einem Verzeichnis ausgeführt werden.

    Wie könnte ich das unter MacOSX 10.5 automatisieren?
    Mit Automator gehts wohl nicht. Vielleicht mit SED via Terminal? Wenn ja, welche Anweisung benötige ich dafür? Bin sehr dankbar über einen Tipp!!!

    CAR
     
  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 bytepool, 10.04.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    dieser kleine Hack fuer die bash und sed sollte das tun was du willst:
    Code:
    for file in ./*; do
       sed -i '1,9d' "$file" && sed -i '2,$d' "$file"
    done
    
    Die For-Schleife iteriert ueber alle Dateien im aktuellen Verzeichnis, und loescht erst die ersten 9 Zeilen, und dann in der geaenderten Datei alles ab der 2. Zeile.

    mfg,
    bytepool
     
  4. CAR

    CAR Jungspund

    Dabei seit:
    10.04.2009
    Beiträge:
    10
    Zustimmungen:
    0
    Wow! Danke. Nur wie funzt das im Detail?

    Ich habe Deinen code ins Terminal kopiert, welches dann ausgibt:

    Das es nicht so gehen kann, ist mir schon klar. Nur für mich als Newbie: Wo muss sich das Verzeichnis mit den Textdateien befinden und wohin werden die Textdateien mit den gelöschten Zeilen ausgegeben?
     
  5. #4 bytepool, 10.04.2009
    Zuletzt bearbeitet: 10.04.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,
    Oehm, kann es sein dass du gar keine Ahnung vom Umgang mit der Shell hast? Wenn du das jetzt einfach so in deinem Home Verzeichnis ausgefuehrt hast, hoffe ich fuer dich, dass du da entweder keine wichtigen Dateien drin hattest, oder dass der sed Befehl in der Tat ueberhaupt nicht funktioniert hat. Sonst haettest du jetzt naemlich gerade alle deine Dateien im Home Verzeichnis verstueckelt.
    Ich schrieb "Die For-Schleife iteriert ueber alle Dateien im aktuellen Verzeichnis", womit ich selbstverstaendlich das aktuelle Verzeichnis der Shell (des Terminals) meinte.

    Die Option -i von sed steht fuer "in-place", d.h. alle Aenderungen die sed durchfuehrt, werden direkt in der Datei selbst gemacht, in etwa so, als wuerdest du die Aenderungen im Texteditor machen, und dann speichern.

    Das Verzeichnis kannst du dementsprechend entweder direkt im Skript festlegen, oder du wechselst einfach in das entsprechende Verzeichnis.

    Ich kenne mich mit Macs im speziellen nicht aus, und weiss dementsprechend auch nicht, welche Shell dort als standard Shell verwendet wird.

    Zu deinem konkreten Problem muesste man also erstmal wissen, welche Shell du verwendest ('echo $SHELL' geht meistens), und welche sed Version du benutzt ('sed --version').

    Jetzt muss ich leider auch erstmal weg.

    mfg,
    bytepool
     
  6. #5 CAR, 10.04.2009
    Zuletzt bearbeitet: 10.04.2009
    CAR

    CAR Jungspund

    Dabei seit:
    10.04.2009
    Beiträge:
    10
    Zustimmungen:
    0
    Geb ich das ein, kommt Folgendes zurück:
    /bin/bash


    sed: illegal option -- -
    usage: sed script [-Ealn] [-i extension] [file ...]
    sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]


    soweit so gut.

    Ansonsten ist durch das Ausführen Deines Scriptes nichts zerstört wurden.

    ....

    Also, was ich auf jeden Fall schon mal hinbekomme, ist das einfache Löschen von mehreren Zeilen: geht so:

    sed -e '1,3D' testdatei.txt > testdatei_neu.txt

    ...löscht die 1. drei Zeilen der Textdatei "testdatei.txt" Wahnsinn!!!
     
  7. #6 JBR, 10.04.2009
    Zuletzt bearbeitet: 10.04.2009
    JBR

    JBR Fichtenschonung

    Dabei seit:
    18.03.2007
    Beiträge:
    561
    Zustimmungen:
    0
    Ort:
    Nolop
    Code:
    #!/bin/bash
    
    #Länge der Datei bestimmen
    length=`wc -l $1|{ read len nirvana; echo $len; }`;
    #Dateiname
    filename=$1."10thlines"
    
    #Ausgabe alter Durchläufe löschen und Datei neu anlegen
    rm $filename
    touch $filename
    
    echo "Länge: $length,Ausgabedateiname: $filename"
    
    #Jede 10. Zeile ausgeben
    i=10;
    while [ $length  -gt $i ];
    do 
        cat $1|head -n $i|tail -n 1 >> $filename;
        i=`expr $i + 10`;
    done
    
    
    Es geht auch ohne Sed :D

    PS
    Wenn du mehr über Shell Scripting,Sed,Grep,Perl und Geschwister wissen möchtest, schau dir mal das Linux Openbook an: http://openbook.galileocomputing.de/linux/ Die ersten sieben Kapitel sollten ganz hilfreich sein.

    So Zeit für ein wenig Bewegung
     
  8. CAR

    CAR Jungspund

    Dabei seit:
    10.04.2009
    Beiträge:
    10
    Zustimmungen:
    0
    nö, geht nicht.
     
  9. Akendo

    Akendo 4k3nd0

    Dabei seit:
    05.02.2008
    Beiträge:
    396
    Zustimmungen:
    0
    Herzlich Glueckwunsch, zur ihren Top Post kann ich nur begluecken, Da nun alle Gluecklich sind koennen wir ja den Thread schliessen.

    /ironie off

    Kann es sein das du keine bash hast?
    Code:
    bash --version
    oder -v sollte hier hilfreich sein.

    Ansonsten waere eine deteilreicher Fehler beschreiubung hier eine Tip.
     
  10. CAR

    CAR Jungspund

    Dabei seit:
    10.04.2009
    Beiträge:
    10
    Zustimmungen:
    0
    Sorry, wenn ich hier die Informatikprofis aufrege, aber ich bin eben kein solcher und will es dennoch schaffen. Ich will hier niemanden beleidigen und erwarte es umgekehrt ebenso.

    Es tut mir also leid, dass ich in meinem letzten Beitrag so kurz war - aber das Skript funktioniert bei mir tatsächlich nicht. Ich kannte die Seite zum dem openbook schon, allerdings arbeite ich nicht auf Linux, sondern MacOSX.

    Folgendes Script funktioniert für eine Datei:

    Ich erhalte "dateineu.txt" mit den jeweils 10. Zeilen. So wollt ich es haben.

    Leider habe ich mehr als hundert Dateien zu bearbeiten, was bedeutet, dass ich mit der manuellen Dateinamensvergebung nicht weiter komme.

    bytepools Script verstehe ich als Schleife, in der Dateien eines Verzeichnisses bearbeitet und wieder gespeichert werden. Allerdings ist das mehr Ahnung, als Verstehen.

    Ich suche also weiter danach:
    Wie kann ich x txt-Dateien aus einem Verzeichnis öffnen, jeweils die 10 Zeile darin löschen und wieder als Datei ausgeben.

    Vielleicht könnt mir doch noch mal Jemand auf den Weg helfen...

    CARolin
     
  11. #10 JBR, 10.04.2009
    Zuletzt von einem Moderator bearbeitet: 11.04.2009
    JBR

    JBR Fichtenschonung

    Dabei seit:
    18.03.2007
    Beiträge:
    561
    Zustimmungen:
    0
    Ort:
    Nolop
    Achso das vergaß ich zu erklären:
    Du musst den Code in einer Textdatei speichern (keine Textverarbeitung verwenden !). Dann musst du ein Terminal öffnen, in den Ordner wechseln in dem du das Script gespeichert hast und es folgendermaßen aufrufen:
    Code:
    sh Dateiname_des_Scripts Dateiname_der_zu_bearbeitenden_Datei
    Ich bau dir gleich noch eine Schleife ein die das für jede Datei im Verzeichnis erledigt

    Wegen des Openbooks: Das erste Kapitel solltest du natürlich überspringen - aber ansonsten werden die allerwenigsten Programme irgendwelche Unterschiede zu den Linux-Varianten aufweisen. Führ einfach mal
    Code:
    bash --version;cp --version;sed --version;grep --version
    aus
     
  12. #11 supersucker, 10.04.2009
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Code:
    sed --version
    hier posten - da hast du vorhin beim Eingeben was falsch gemacht, wenn das hier:

    zurückkam.

    Und das hier (von bytepool):

    Code:
    for file in ./*; do
       sed -i '1,9d' "$file" && sed -i '2,$d' "$file"
    done
    funktioniert wunderbar - auch unter MacOs.

    Du musst nur den "." entsprechend durch deinen Verzeichnisnamen ersetzen.

    Angenommen also die ganzen Dateien befinden sich in einem Verzeichnis in deinem Home-Verzeichnis namens "test" dann machst du die Konsole auf, tippelst


    Code:
    cd
    ein (dann befindest du dich in deinem Home-Verzeichnis) und kopierst dann folgende Zeile in die Konsole:

    Code:
    for file in test/*; do sed -i '1,9d' "$file" && sed -i '2,$d' "$file"; done
    Das "test" musst du logischerweise mit dem Verzeichnisnamen ersetzen wie er bei dir heißt.
     
  13. #12 bytepool, 10.04.2009
    Zuletzt bearbeitet: 10.04.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    da bin ich wieder.

    Hehe, auf die sinnige Idee, dass ich mich in der Eile vertippt habe, und verison eigentlich version heissen sollte, bist du nicht gekommen, oder? ;)

    Allerdings verstehe ich jetzt nach dem lesen deiner weiteren Posts schon nicht mehr, was du denn eigentlich willst. Mal soll alles bis auf die 10. Zeile geloescht werden, dann soll ploetzlich nur die 10. Zeile geloescht werden, mal soll das alles in der Datei direkt passieren, mal sollen die Aenderungen in neue Dateien geschrieben werden...
    Ich verstehe noch genau Bahnhof.

    Stimmt, man koennte das Programm auch in Assembler, C, C++, Prolog, Java, Perl, Python, Ada, PHP oder in 20 verschiedenen Varianten als Shell Skript schreiben. Mal leichter, mal schwerer. Wo ist der Sinn der Aussage?

    Koenntest du das sinnlose trollen mal sein lassen? Das ist mir jetzt schon haeufiger aufgefallen, dass du so sinnfreie Sachen postest. Auch wenn "Noe, geht nicht" im Allgemeinen keine schoene Antwort ist, so ist deine Antwort noch schlimmer.

    Ein Deutsch das schon fast unter aller Sau ist, katastrophale Interpunktion, und offensichtlich noch nicht mal die vorherigen Beitraege richtig gelesen. Die Frage nach der Shell wurde bereits gestellt _und_ beantwortet.

    Ich waere dir doch sehr verbunden, wenn du in Zukunft den Kopf vorm Posten einschalten wuerdest, und den Beitrag den du schreiben willst nochmal durchliest. Wenn du dann feststellst, dass du nichts substanzielles beizutragen hast, so ist Nicht-Posten kein Verbrechen.

    mfg,
    bytepool
     
  14. #13 CAR, 11.04.2009
    Zuletzt bearbeitet: 11.04.2009
    CAR

    CAR Jungspund

    Dabei seit:
    10.04.2009
    Beiträge:
    10
    Zustimmungen:
    0
    Naja, ich habe jedes Wort sehr ernst genommen, ich nahm jedoch an, dass Dein Code korrekt ist. Ich gab also
    ein und es kam die besagte Fehlermeldung heraus. Das tut sie immer noch.:(


    Also, ich habe

    1. 100 Dateien in einem Verzeichnis liegen
    2. Ich möchte in jeder dieser Dateien jede 10. Zeile behalten, also 10. - 20. - 30. Zeile usw., die Zeilen dazwischen löschen - also: 1. bis 9., 11. bis 19., 21. bis 29. Zeile usw.

    Ich habe zwar schon eine Lösung, in dem ich die Dateien durch eine Datenbanksoftware filtere, brauche dabei aber pro Datei 20 Minuten, was bei 100 Dateien unendlich lange dauern würde...

    So kam ich auf sed..

    Wenn ich das hier eingebe:

    kommt bei mir:

    obwohl ich mein Verzeichnis "test" genannt habe. ??


    Hab ich - Ergebnis:

    CARolin
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 bytepool, 11.04.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    ich hatte mich wie gesagt in der Eile vertippt, und nahm an, dass du das dann einfach falsch abgetippt hast. Aber wenn auch --version nicht funktioniert, dann benutzt du jedenfalls eindeutig kein GNU sed. Versuch doch mal 'man sed', was dir das Handbuch deiner sed Version anzeigen sollte. Dort sollten dann auch alle moeglichen Optionen deiner sed Version aufgelistet werden. Zu verlassen mit 'q'.

    Dann habe ich dich eindeutig missverstanden, ich dachte du wolltest nur die 10. Zeile einer jeden Datei behalten. Das macht die Sache ein wenig komplexer.
    Was ich aber immer noch nicht verstanden habe, ob du die Aenderungen direkt in den Dateien selber haben willst, oder ob neue Dateien angelegt werden sollen. Aber wenn du vorher Backups machst, was man sowieso immer machen sollte, ist das ja eigentlich auch Schnuppe. ;)

    Naja, ich habe leider keine Zeit mehr, und bin die naechsten 2 Tage wahrscheinlich nicht online, aber vielleicht findet sich ja noch jemand, der einen Loesungsansatz fuer dich hat.

    mfg,
    bytepool
     
  17. Shorti

    Shorti Routinier

    Dabei seit:
    08.04.2007
    Beiträge:
    271
    Zustimmungen:
    0
    Code:
    #!/usr/bin/perl -w
    
    use strict;
    my $fh;
    my $file;
    my $i;
    my $text;
    
    foreach $file (glob("*.txt")) {#fuer alle txt-Dateien im jetzigen Ordner
    #Bei dir evtl "foreach $file (glob("Ordner/*.pst")) {"
    #Bei "foreach $file (glob("Ordner/*")) {" ist die Dateiendung Wurscht
    $text = "";
    $i=1;
    open(FH,"$file");
    while (<FH>) {
    if ($i == 10) {
    $text .= $_;
    $i=0;
    }
    $i++;
    }
    close FH;
    
    open(FH,">$file");
    print FH $text;
    close FH;
    }
    
    Ist in perl geschrieben. Wie vorhin schon gesagt pass auf was du machst! Du kannst damit eineigen Mist machen.
     
Thema: Wie automatisiere ich: Textdatei nur jede 10. Zeile behalten
Besucher kamen mit folgenden Suchen
  1. grep jede 11. zeile

    ,
  2. linux script jede 10. datei

Die Seite wird geladen...

Wie automatisiere ich: Textdatei nur jede 10. Zeile behalten - Ähnliche Themen

  1. Dokumente scannen automatisieren

    Dokumente scannen automatisieren: Hi, ich würde gerne das Scannen von Dokumenten so vereinfachen, dass nur noch auf ein Scannen-Button geklickt werden muss, und dann das fertige...
  2. CUPS Integration - Duplikate automatisieren

    CUPS Integration - Duplikate automatisieren: Hallo Gemeinde, es handelt sich um CUPS, habe keinen passenderen Platz gefunden, die SParte "Drucker" war mir zu allgemein. Ist es möglich...
  3. eine Usereingabe automatisieren

    eine Usereingabe automatisieren: hallo allerseits, ich habe mich gerade gefragt, wie man ein porgramm das eine eingabe vom user verlangt, dazu bringen kann eine...
  4. USB Speicher Backup Automatisieren

    USB Speicher Backup Automatisieren: hi Zeit zwei Woche suche ich ein Schell Skript was überwacht ein Katalog z.B /dev/sda1/Backup/Backup 1 er ist auf SD-128MB und nach...
  5. IRC-Statsgenerierung+FTP-Upload via psig automatisieren

    IRC-Statsgenerierung+FTP-Upload via psig automatisieren: Hallo zusammen, wie dem Titel zu entnehmen ist, suche ich eine Möglichkeit, die Generierung von IRC-Stats via pisg incl. anschließenden...