Shell Script zum Vergleich von Zeilen

S

solnew

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
 
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"
 
Zuletzt bearbeitet:
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.
 
Zuletzt bearbeitet:

Ähnliche Themen

Zeilen löschen und ersetzen mit sed

Zeile an txt anhängen

Linux Systemadministration v. Jochen Hein

Zurück
Oben