Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Mit AWK verschiedene Felder verschiedener Zeilen vergleichen

  1. #1
    Registrierter Benutzer
    Registriert seit
    May 2017
    Beiträge
    3

    Mit AWK verschiedene Felder verschiedener Zeilen vergleichen

    Hallo alle zusammen!

    Bei folgender Aufgabe komme ich nicht weiter.
    Hier ist der zu verarbeitende Inhalt einer Datei (die Zeilennummern gehören nicht zum Inhalt, nur für die nachfolgende Erläuterung der Aufgabenstellung) :

    01. AAA;AAB;10
    02. AAB;AAA;12
    03. AAA;FAC;26
    04. AAA;FAV;15
    05. DAD;HHZ;89
    06. AAA;HOI;33
    07. AAA;MKP;59
    08. AAA;PPT;45
    09. AAA;RRR;88
    10. AAA;TTQ;87
    11. HHZ;DAD;89
    12. MKP;AAA;59

    Diese Datei muss eingelesen werden, ausgegeben müssen alle vorhandenen Zeilen und die Zeilen, wo $1 der Zeile n nicht gleich $2 der Zeile m ist und $2 der Zeile n nicht gleich $1 der Zeile m ist, und in dieser Reihenfolge: $2;$1;$3.

    Also, Zeile 1 und Zeile 2 müssen nicht angefasst werden, weil da findet man in beiden Zeilen Werte AAA und AAB, nur verdreht. Genauso Zeile 5 und Zeile 11, und Zeile 7 und Zeile 12.
    Alle anderen Zeilen haben sozusagen, keine gespiegelten "Doppelgänger" und für Sie muss so ein "Doppelgänger" generiert und der Datei hinzugefügt werden (an welcher Stelle, spielt keine Rolle).

    Das ist der gewünschte Output:

    01. AAA;AAB;10
    02. AAB;AAA;12
    03. AAA;FAC;26
    04. AAA;FAV;15
    05. DAD;HHZ;89
    06. AAA;HOI;33
    07. AAA;MKP;59
    08. AAA;PPT;45
    09. AAA;RRR;88
    10. AAA;TTQ;87
    11. HHZ;DAD;89
    12. MKP;AAA;59
    13. FAC;AAA;26
    14. FAV;AAA;15
    15. HOI;AAA;33
    16. PPT;AAA;45
    17. RRR;AAA;88
    18. TTQ;AAA;87

    Könnte mir bitte jemand helfen? Alle meine Versuche bleiben bisher erfolglos. Muss auch nicht unbedingt mit AWK erledigt werden. Danke!

  2. #2

  3. #3
    .
    Registriert seit
    Oct 2001
    Ort
    Oberbayern
    Beiträge
    2.281
    Code:
    tmpdict = {}
    
    # read in.txt to dict
    with open("in.txt") as f:
        for line in f:
            line = line.strip()
            l = line.split(";")
            if l[0] not in tmpdict:
                tmpdict[l[0]] = {}
            tmpdict[l[0]][l[1]] = l[2]
    
    # search one outer entry which is missing
    # and add it
    # you have to stop iteration because you change the iterating object
    def search():
        for k_o in tmpdict:
            for k_i in tmpdict[k_o]:
                if k_i not in tmpdict:
                    tmpdict[k_i] = {}
                    tmpdict[k_i][k_o] = tmpdict[k_o][k_i]
                    return False
                # genau genommen fehlt hier noch ein fall aber das ist vielleicht
                # eine weitere übungsaufgabe ;)
                # und wird von den aktuellen eingangsdaten nicht aufgedeckt
        return True
    
    # search as long as there are changes made
    while search() == False:
        pass
    
    # ordered output to out.txt
    with open("out.txt", "w") as f:
        x = tmpdict.keys()
        x.sort()
        for k_o in x:
            y = tmpdict[k_o].keys()
            y.sort()
            for k_i in y:
                f.write("{};{};{}\n".format(k_o, k_i, tmpdict[k_o][k_i]))
    das ist mal eine python variante. bestimmt nicht ideal gelöst aber das ergebnis ist nicht das schlechteste.
    Geändert von quinte17 (25.12.17 um 09:30 Uhr)
    Core i3 | 2x3tb btrfs-raid1 | 2x2tb sw-raid1+lvm2

  4. #4
    Registrierter Benutzer
    Registriert seit
    May 2017
    Beiträge
    3
    Hallo quinte17, das werde ich ausprobieren. Vielen Dank für Deine Hilfe!

  5. #5
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.243
    In bash wuerde sowas so aussehen koennen, vorsicht ungetestet

    Code:
    #!/bin/bash
    
    while read line; do
    
      var1=$(cut -d";" f1 $line)
      var2=$(cut -d";" f2 $line)
      var3=$(cut -d";" f3 $line)
    
      if $(grep "$var2;$var1" file.txt | wc -l) -lt 1; then 
    
        echo "$var2;$var1;$var3" >> file2.txt
    
      else 
    
        echo $line >> file2.txt
    
      fi
    
    done; < file.txt
    Frage: Ist das eine Aufgabe fuer die Ausbildung? Wenn ja mache es mit python oder aehnlichem, das sieht schoener aus und bringt dich weiter als unschoener bash code
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  6. #6
    Registrierter Benutzer
    Registriert seit
    May 2017
    Beiträge
    3
    Zitat Zitat von Huhn Hur Tu Beitrag anzeigen
    In bash wuerde sowas so aussehen koennen, vorsicht ungetestet

    Frage: Ist das eine Aufgabe fuer die Ausbildung? Wenn ja mache es mit python oder aehnlichem, das sieht schoener aus und bringt dich weiter als unschoener bash code
    Hallo Huhn Hur Tu, danke für Deinen Vorschlag in bash. Das kann ich gut verstehen. Ich musste Mal sowas auf der Arbeit lösen, obwohl das nicht meine primäre Aufgabe ist. Mit Python hatte ich vor Jahren gearbeitet, werde meine Kenntnisse jetzt auffrischen, da Python sehr populär ist und gebraucht wird.

Ähnliche Themen

  1. latex: verschiedene seitenraender/layouts fuer verschiedene seiten
    Von Freekazonid im Forum Anwendungen Allgemein, Software
    Antworten: 3
    Letzter Beitrag: 06.03.06, 15:34
  2. Antworten: 2
    Letzter Beitrag: 10.07.05, 20:30
  3. KDE - GUI Felder füllen
    Von City][Sepp im Forum Windowmanager
    Antworten: 0
    Letzter Beitrag: 27.06.05, 16:30
  4. verschiedene themes für verschiedene phpbb foren
    Von plugnpray im Forum Linux als Server
    Antworten: 4
    Letzter Beitrag: 03.12.02, 15:45
  5. Verschiedene Aufloesungen fuer verschiedene Benutzer
    Von KingJBF im Forum X-Konfiguration
    Antworten: 9
    Letzter Beitrag: 06.10.02, 00:32

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •