PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit AWK verschiedene Felder verschiedener Zeilen vergleichen



AndreasAndy
24.12.17, 22:36
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!

fork
25.12.17, 03:26
Crosspost:

http://www.linuxforen.de/forums/showthread.php?281112-Mit-AWK-verschiedene-Felder-verschiedener-Zeilen-vergleichen&p=1849658#post1849658

https://www.unixboard.de/threads/mit-awk-verschiedene-felder-verschiedener-zeilen-vergleichen.59060/

https://debianforum.de/forum/posting.php?mode=edit&f=34&p=1157876

quinte17
25.12.17, 08:22
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.

AndreasAndy
25.12.17, 22:20
Hallo quinte17, das werde ich ausprobieren. Vielen Dank für Deine Hilfe!

Huhn Hur Tu
27.12.17, 08:52
In bash wuerde sowas so aussehen koennen, vorsicht ungetestet



#!/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

AndreasAndy
28.12.17, 17:43
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.