Shell Script zum Vergleich von Zeilen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von solnew, 14.10.2008.

  1. solnew

    solnew Grünschnabel

    Dabei seit:
    14.10.2008
    Beiträge:
    1
    Zustimmungen:
    0
    Hallo,

    ich bin absoluter Neuling und habe mich bereits mit dem Zusammenfügen von Dateien etc. beschäftigt. Bin auch schon in einem anderen Forum auf hilfreiche Tipps gestoßen,allerdings ist es noch nicht genau was ich suche. Nun brauche ich aber Eure Hilfe. Ich möchte in einem File, das folgender Struktur entspricht bistimmte Zeilen löschen.

    Mein File:

    Code:
    test.irgendwas.1234
    test.anders.1235
    test1.gjsdggfd.21543
    ...
    

    Ich möchte nun Zeilen nach gleichem Anfang suchen lassen (wie im Bsp. die Zeile 1 und 2) und möchte anschließend die Zahlen (1234) vergleichen. Anschließend geht es darum die Zeile mit dem niedrigeren Zahlenwert zu löschen....

    Für Eure Hilfe wäre ich sehr dankbar. Achja, ich möchte das ganze mit einem Bash-Script machen, da ich schon einige Befehle im Vorfeld ausführe und dies schon sehr gut klappt.

    Grüße

    solnew
     
  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 slackfan, 14.10.2008
    Zuletzt bearbeitet: 14.10.2008
    slackfan

    slackfan König

    Dabei seit:
    18.04.2006
    Beiträge:
    809
    Zustimmungen:
    0
    Ort:
    Bonn
    Hallo,

    das ist ja schon fast eine richtige Programmieraufgabe.
    So sieht eine Python-Lösung aus. Habe versucht, es halbwegs verständlich zu schreiben. Mit Bash-Scripting ist mir das zu heiß :D
    Code:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import sys
    import os.path
    
    myLowest = {}
    myUnique = {}
    
    def analyse(file):
        fobj = open(file, "r")
        for line in fobj:
            #Split line
            first = line.split(".")[0]
            number = line.split(".")[2]
            #Identify lowest value
            if myLowest.has_key(first):
                myUnique[first] = False
                if myLowest[first] > first:
                    myLowest[first] = number
            else:
                myUnique[first] = True
                myLowest[first] = number
        fobj.close()
    
    def remove(file):
        fobj = open(file, "r")
        #Remove lowest
        for line in fobj:
            #Split line
            first = line.split(".")[0]
            number = line.split(".")[2]
            #Print all but lowest
            if myLowest[first] != number:
                print line,
            else:
                #Check if lowest was unique
                if myUnique[first] == True:
                    print line,
        fobj.close()
    
    if __name__ == "__main__":
        if len(sys.argv) > 1:
            for file in sys.argv:
                if file != sys.argv[0]:
                    if os.path.isfile(file):
                        analyse(file)
                        remove(file)
    
    Aufruf per "./pythondatei.py eingabedatei.txt"
     
  4. #3 Gott_in_schwarz, 15.10.2008
    Zuletzt bearbeitet: 16.10.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Code:
    echo 'test.irgendwas.1234
    test.anders.1235
    test1.gjsdggfd.21543'|
    perl -anF'\.' -le '$h{$F[0]} = [$F[2], $_] if (!exists $h{$F[0]} || $h{$F[0]}[0] < $F[2]); END {print $h{$_}[1] for keys %h}'
    print Dumper \%h
    Code:
    $VAR1 = {
              'test' => [
                          1235,
                          'test.anders.1235'
                        ],
              'test1' => [
                           '21543',
                           'test1.gjsdggfd.21543'
                         ]
            };
    edit: musste natürlich $h{$F[0]}[0] < $F[2] heißen. Und wenn man die Reihenfolge der Zeilen beibehalten will:
    Code:
    echo -e 'test1.foo.1\ntest.foo.2\ntest1.bar.2\ntest.bar.1'|
    perl -anF'\.' -le '$h{$F[0]} = [$F[2], $., $_] if (!exists $h{$F[0]} || $h{$F[0]}[0] < $F[2]); END {print $h{$_}[2] for sort { $h{$a}[1] <=> $h{$b}[1] } keys %h}'
    print Dumper \%h
    Code:
    $VAR1 = {
              'test' => [
                          2,
                          '2',
                          'test.foo.2'
                        ],
              'test1' => [
                           2,
                           '3',
                           'test1.bar.2'
                         ]
            };
    $. ist die aktuelle Zeilennummer.
     
Thema:

Shell Script zum Vergleich von Zeilen

Die Seite wird geladen...

Shell Script zum Vergleich von Zeilen - Ähnliche Themen

  1. Shell Script Problem

    Shell Script Problem: Hallo zusammen, ich arbeite momentan mit einem Plagiat Tool, die ich über Git Bash ausführe. Es wird im Endeffekt ein Link generiert, die ich...
  2. Shellscript für rotierende Datensicherung

    Shellscript für rotierende Datensicherung: Hallo, ich beschäftige mich erst seit ein paar Wochen mit der Shell und habe mich entschlossen meine ersten Scripterfahrungen in diesem kleinen...
  3. Shellscript unerwartetes Dateiende

    Shellscript unerwartetes Dateiende: Hallo zusammen, folgendes Script führe ich in einer .bat via cygwin und curl aus. Beim Ausführen erhalte ich die einen Syntaxfehler:...
  4. shell-script mit plink starten

    shell-script mit plink starten: Hallo, auf meinem kleinen QNAP-Backupserver möchte ich von meinem Windows 7 PC mittels Windows-Batch ein kleines shell script starten. So sieht...
  5. Einfaches Shellscript - dateinamen ändern

    Einfaches Shellscript - dateinamen ändern: Hey, kann mir jemand vielleicht bei diesem miniscript helfen? ich habe dateien die folgendermaßen aussehen MM-DD-YY-dateiname und...